相信看過 每天學點SpringCloud(一):簡單服務提供者消費者調用的同學都發現了,在最後消費者調用提供者的時候把提供者的地址硬編碼在了代碼中,這樣的方式肯定是不行的,今天,我們就是要Eureka來解決這個問題 創建Eureka服務 1.我們在原先項目的基礎上再新建一個項目cloud-demo- ...
相信看過 每天學點SpringCloud(一):簡單服務提供者消費者調用的同學都發現了,在最後消費者調用提供者的時候把提供者的地址硬編碼在了代碼中,這樣的方式肯定是不行的,今天,我們就是要Eureka來解決這個問題
創建Eureka服務
1.我們在原先項目的基礎上再新建一個項目cloud-demo-eureka
此項目的依賴為
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>spring-cloud-demo</artifactId>
<groupId>cn.org.zhixiang</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloud-demo-eureka</artifactId>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<!--註意此處的依賴是SpringBoot2.0以後專用的,如果您使用的SpringBoot版本低於2.0請使用spring-cloud-starter-eureka-server-->
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.創建application.yml
spring:
application:
name: eureka-server
#開啟許可權認證
security:
basic:
enabled: true
user:
name: root
password: root
server:
host: localhost
port: 8761
eureka:
client:
#此項目不作為客戶端註冊
register-with-eureka: false
fetch-registry: false
service-url:
#開啟許可權驗證後Eureka地址為 用戶名:密碼@地址:埠號,如未開啟許可權驗證則直接使用 地址:埠號
defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@${server.host}:${server.port}/eureka
3.創建cn.org.zhixiang包,在此包下創建CloudDemoEureApplication啟動類
package cn.org.zhixiang;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class CloudDemoEureApplication {
public static void main(String[] args) {
SpringApplication.run(CloudDemoEureApplication.class, args);
}
}
4.如果您開啟了許可權驗證並且SpringBoot版本為2.0以上的話還需要一個操作,如果不是此布可以忽略
因為2.0預設開啟了csrf,如果我們現在直接啟動Eureka服務的話客戶端是註冊不上的,所以需要把csrf關閉
在cn.org.zhixiang包下新建security包,新建WebSecurityConfigurer類
@EnableWebSecurity
public class WebSecurityConfigurer extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
super.configure(http);
}
}
5.在CloudDemoEureApplication啟動類中啟動Eureka服務,瀏覽器訪問http://localhost:8761/eureka,輸入用戶名root和密碼root登陸Eureka後Eureka服務創建成功。
修改服務提供者
1.在原先的cloud-demo-provider項目中添加Eureka依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
2.修改application.yml,增加以下配置
eurekaServer:
host: localhost
port: 8761
user: root
password: root
eureka:
client:
#將此項目註冊到Eureka服務
register-with-eureka: true
service-url:
defaultZone: http://${eurekaServer.user}:${eurekaServer.password}@${eurekaServer.host}:${eurekaServer.port}/eureka
3.在CloudDemoProviderApplication啟動類中增加一個註解:@EnableEurekaClient標示此項目是Eureka客戶端
4.緊接著先啟動剛纔創建的Eureka服務再啟動此項目,當我們再次訪問Eureka的時候可以發現我們的項目已經註冊上了Eureka
5.因為我們此次需要玩點高大上的了,所以只有一個服務提供者肯定是不行的,我們copy一下上方的cloud-demo-provider項目,新項目命名為cloud-demo-provider-2,這個新項目需要修改的地方只有三個:
第一是pom文件中的項目id註意不要與上個項目一樣,推薦直接叫做cloud-demo-provider-2.
第二是yml文件中spring.application.name應該是與上個項目都一樣的,名字叫做:provider-demo。這個不做修改,只需要修改server.port,保證埠不會衝突,比如我改成了8079
第三是UserController,可以看到上個項目返回的User是硬編碼的叫做張三的,這次這個項目我們把這個張三修改成李四,來區分這兩個項目
修改完畢以後啟動項目Eureka中應該是這樣的
就是這個provider-demo的服務有兩個提供者的意思
修改消費者
現在我們已經開始修改上次服務地址硬編碼的問題了
1.cloud-demo-consumer項目增加Eureka依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
2.啟動類中增加了兩個註解
@SpringBootApplication
@EnableEurekaClient
public class CloudDemoConsumerApplication {
@Bean
@LoadBalanced//開啟負載均衡
public RestTemplate restTemplate(){
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(CloudDemoConsumerApplication.class, args);
}
}
3.在UserController中做一下改變
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/getUser/{id}")
public User getUser(@PathVariable Long id){
return restTemplate.getForObject("http://provider-demo/user/getUser/"+id,User.class);
}
}
可以看到,我們上次使用的localhost:8078/user/getUser已經換成了provider-demo/user/getUser了。不知道大家還記不記得這個provider-demo麽?它呢,是兩個項目中spring.application.name的屬性值,在Eureka中呢,就對應著一個服務的id,也就是說在Eureka中,我們可以不使用ip+埠而是使用Ip去訪問服務。
大家將這四個項目都啟動起來以後,訪問http://localhost:8088/user/getUser/5,是不是發現一會會返回張三,一會會返回李四呢。這個就是我們一開始加的@LoadBalanced註解,也就是開啟了Eureka的負載均衡。這樣的話我們是不是已經完美的完成了昨天遺留的問題呢?
GitHub:https://github.com/2388386839/spring-cloud-demo
碼雲:https://gitee.com/zhixiang_blog/apring-cloud-demo
如果對您有所幫助,請記得幫忙點一個star哦
本文出自https://zhixiang.org.cn/#/blog/read/3e9e73fd-bda0-4638-826b-cceb43b77b07,轉載請保留。