相信看過 每天學點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:github.com/shiyujun/sp…
如果對您有所幫助,請記得幫忙點一個star哦
本文出自zhixiang.org.cn/#/blog/read…,轉載請保留。