相信看過 每天學點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/shiyujun/spring-cloud-demo
如果對您有所幫助,請記得幫忙點一個star哦
本文出自https://zhixiang.org.cn/#/blog/read/3e9e73fd-bda0-4638-826b-cceb43b77b07,轉載請保留。