每天學點SpringCloud(二):服務注冊與發現Eureka


 

相信看過 每天學點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,轉載請保留。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM