SpringCloud的入門學習之Eureka(高可用註冊中心HA)構建Provider服務、Consumer服務
- 2019 年 11 月 12 日
- 筆記
1、在高可用的Eureka註冊中心中構建provider服務。
使用springboot的多環境配置,來搭建Eureka的高可用集群式部署。由於使用的是maven構建的springboot項目,所以首先引入pom.xml配置文件,這裡需要注意的是springboot的版本、springcloud的版本對應,不然會出現一個版本不對應錯誤,稍後可以貼一下錯誤。我使用的springboot版本是2.2.0的,springcloud版本是Hoxton.RC1。
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 5 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 6 <modelVersion>4.0.0</modelVersion> 7 <parent> 8 <groupId>org.springframework.boot</groupId> 9 <artifactId>spring-boot-starter-parent</artifactId> 10 <version>2.2.0.RELEASE</version> 11 <relativePath /> 12 <!-- lookup parent from repository --> 13 </parent> 14 <groupId>com.bie</groupId> 15 <artifactId>springcloud-eureka-provider</artifactId> 16 <version>0.0.1-SNAPSHOT</version> 17 <name>springcloud-eureka-provider</name> 18 <description>Demo project for Spring Boot</description> 19 20 <properties> 21 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 22 <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 23 <java.version>1.8</java.version> 24 <spring-cloud.version>Hoxton.RC1</spring-cloud.version> 25 <maven-jar-plugin.version>3.1.1</maven-jar-plugin.version> 26 </properties> 27 28 <dependencies> 29 <dependency> 30 <groupId>org.springframework.boot</groupId> 31 <artifactId>spring-boot-starter-web</artifactId> 32 </dependency> 33 <!-- springcloud eureka 客戶端 --> 34 <dependency> 35 <groupId>org.springframework.cloud</groupId> 36 <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> 37 </dependency> 38 <dependency> 39 <groupId>org.springframework.boot</groupId> 40 <artifactId>spring-boot-starter-test</artifactId> 41 <scope>test</scope> 42 <exclusions> 43 <exclusion> 44 <groupId>org.junit.vintage</groupId> 45 <artifactId>junit-vintage-engine</artifactId> 46 </exclusion> 47 </exclusions> 48 </dependency> 49 </dependencies> 50 51 <dependencyManagement> 52 <dependencies> 53 <dependency> 54 <groupId>org.springframework.cloud</groupId> 55 <artifactId>spring-cloud-dependencies</artifactId> 56 <version>${spring-cloud.version}</version> 57 <type>pom</type> 58 <scope>import</scope> 59 </dependency> 60 </dependencies> 61 </dependencyManagement> 62 63 <build> 64 <plugins> 65 <plugin> 66 <groupId>org.springframework.boot</groupId> 67 <artifactId>spring-boot-maven-plugin</artifactId> 68 </plugin> 69 </plugins> 70 </build> 71 72 <repositories> 73 <repository> 74 <id>spring-milestones</id> 75 <name>Spring Milestones</name> 76 <url>https://repo.spring.io/milestone</url> 77 </repository> 78 </repositories> 79 80 </project>修改配置文件application.properties。內容如下所示:
1 # 配置項目名稱 2 spring.application.name=springcloud-eureka-provider 3 4 # 配置埠號 5 spring.port=8080 6 7 # 客戶端需要向服務端進行註冊,必須配置服務端的地址。知道服務端在那裡。 8 #設置服務註冊中心地址,可以將集群中的所有節點列處理。 9 eureka.client.serviceUrl.defaultZone=http://eureka1:8761/eureka/,http://eureka2:8761/eureka/
將Eureka客戶端的的註解加到啟動類上面。
1 package com.bie; 2 3 import org.springframework.boot.SpringApplication; 4 import org.springframework.boot.autoconfigure.SpringBootApplication; 5 import org.springframework.cloud.netflix.eureka.EnableEurekaClient; 6 7 @EnableEurekaClient // Eureka客戶端 8 @SpringBootApplication 9 public class SpringCloudApplication { 10 11 public static void main(String[] args) { 12 SpringApplication.run(SpringCloudApplication.class, args); 13 } 14 15 }注意,需要將伺服器ip地址和別稱映射加到hosts配置文件裡面的。C:WindowsSystem32driversetchosts。
1 192.168.110.133 eureka1 2 192.168.110.134 eureka2
將配置日誌管理的配置文件,logback.xml。如下所示。
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <configuration> 3 <!--定義日誌文件的存儲地址 勿在 LogBack 的配置中使用相對路徑 --> 4 <property name="LOG_HOME" value="${catalina.base}/logs/" /> 5 <!-- 控制台輸出 --> 6 <appender name="Stdout" 7 class="ch.qos.logback.core.ConsoleAppender"> 8 <!-- 日誌輸出編碼 --> 9 <layout class="ch.qos.logback.classic.PatternLayout"> 10 <!--格式化輸出:%d表示日期,%thread表示執行緒名,%-5level:級別從左顯示5個字元寬度%msg:日誌消息,%n是換行符 --> 11 <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - 12 %msg%n 13 </pattern> 14 </layout> 15 </appender> 16 <!-- 按照每天生成日誌文件 --> 17 <appender name="RollingFile" 18 class="ch.qos.logback.core.rolling.RollingFileAppender"> 19 <rollingPolicy 20 class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 21 <!--日誌文件輸出的文件名 --> 22 <FileNamePattern>${LOG_HOME}/server.%d{yyyy-MM-dd}.log 23 </FileNamePattern> 24 <MaxHistory>30</MaxHistory> 25 </rollingPolicy> 26 <layout class="ch.qos.logback.classic.PatternLayout"> 27 <!--格式化輸出:%d表示日期,%thread表示執行緒名,%-5level:級別從左顯示5個字元寬度%msg:日誌消息,%n是換行符 --> 28 <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - 29 %msg%n 30 </pattern> 31 </layout> 32 <!--日誌文件最大的大小 --> 33 <triggeringPolicy 34 class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> 35 <MaxFileSize>10MB</MaxFileSize> 36 </triggeringPolicy> 37 </appender> 38 39 <!-- 日誌輸出級別 --> 40 <root level="DEBUG"> 41 <appender-ref ref="Stdout" /> 42 <appender-ref ref="RollingFile" /> 43 </root> 44 45 </configuration>2、開始開發服務,向Eureka Server註冊中心服務端進行服務的註冊。
首先,啟動主啟動類,可以看到已經將服務註冊到Eureka Server註冊中心。如下所示:

首先,配置一個實體類,然後開發一個控制層介面方法。
1 package com.bie.po; 2 3 /** 4 * 5 * @author biehl 6 * 7 */ 8 public class User { 9 10 private int id; 11 private String username; 12 private int age; 13 14 public int getId() { 15 return id; 16 } 17 18 public void setId(int id) { 19 this.id = id; 20 } 21 22 public String getUsername() { 23 return username; 24 } 25 26 public void setUsername(String username) { 27 this.username = username; 28 } 29 30 public int getAge() { 31 return age; 32 } 33 34 public void setAge(int age) { 35 this.age = age; 36 } 37 38 public User(int id, String username, int age) { 39 super(); 40 this.id = id; 41 this.username = username; 42 this.age = age; 43 } 44 45 public User() { 46 super(); 47 } 48 49 @Override 50 public String toString() { 51 return "User [id=" + id + ", username=" + username + ", age=" + age + "]"; 52 } 53 54 } 1 package com.bie.controller; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 import org.springframework.web.bind.annotation.RequestMapping; 7 import org.springframework.web.bind.annotation.RestController; 8 9 import com.bie.po.User; 10 11 /** 12 * 13 * @author biehl 14 * 15 */ 16 @RestController 17 public class UserController { 18 19 @RequestMapping(value = "/showUser") 20 public List<User> getListUser() { 21 List<User> list = new ArrayList<User>(); 22 23 User user = new User(); 24 user.setId(1008611); 25 user.setUsername("zhangsan"); 26 user.setAge(25); 27 list.add(user); 28 29 User user2 = new User(); 30 user2.setId(1008612); 31 user2.setUsername("lisi"); 32 user2.setAge(24); 33 list.add(user2); 34 35 User user3 = new User(); 36 user3.setId(1008613); 37 user3.setUsername("wangwu"); 38 user3.setAge(23); 39 list.add(user3); 40 41 return list; 42 } 43 }最後,開發完服務中的介面以後,啟動主啟動類,將服務註冊到註冊中心當中去。查看演示效果,如下所示:
開發服務提供者,通過瀏覽器訪問介面成功,代表成功將服務註冊到Eureka Server註冊中心。

3、在高可用的Eureka註冊中心中構建consumer服務。由於consumer服務也是Eureka的客戶端,所以pom.xml配置文件這裡省略了。logback.xml配置文件一致即可,這裡省略了。啟動主類一致,這裡也省略了,都需要加上@EnableEurekaClient,代表Eureka的客戶端。
注意:服務的消費者與提供者都需要在Eureka註冊中心註冊。consumer服務也需要去Eureka Server服務端進行註冊,這樣才可以去消費Eureka Server註冊中心的服務。
修改配置文件application.properties。內容如下所示:
1 # 配置項目名稱 2 spring.application.name=springcloud-eureka-consumer 3 4 # 配置埠號 5 spring.port=8081 6 7 # 客戶端需要向服務端進行註冊,必須配置服務端的地址。知道服務端在那裡。 8 #設置服務註冊中心地址,可以將集群中的所有節點列處理。 9 eureka.client.serviceUrl.defaultZone=http://eureka1:8761/eureka/,http://eureka2:8761/eureka/
consumer服務調用provider服務,需要知道provider服務的基本資訊,比如ip地址、埠等等。SpringCloud微服務中如何知道調用服務的基本資訊呢?人家封裝好了類讓你用啦,抓緊學吧,孩子。
通過LoadBalancerClient 獲取到服務提供方的ip地址和埠號,拼接出URL,進行方法的調用。
1 package com.bie.service; 2 3 import java.util.List; 4 5 import org.springframework.beans.factory.annotation.Autowired; 6 import org.springframework.cloud.client.ServiceInstance; 7 import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; 8 import org.springframework.core.ParameterizedTypeReference; 9 import org.springframework.http.HttpMethod; 10 import org.springframework.http.ResponseEntity; 11 import org.springframework.stereotype.Service; 12 import org.springframework.web.client.RestTemplate; 13 14 import com.bie.po.User; 15 16 /** 17 * 18 * @author biehl 19 * 20 */ 21 @Service 22 public class UserService { 23 24 // SpringCloud提供的負載均衡的對象。 25 // ribbon的負載均衡器。通過該對象可以獲取調用服務的ip地址、埠號等等資訊。 26 // 通過服務的名稱獲取到調用服務的ip地址、埠號等等資訊。 27 @Autowired 28 private LoadBalancerClient loadBalancerClient; 29 30 public List<User> getListUser() { 31 // 1、選擇調用的服務的名稱 32 // 注意,ServiceInstance封裝了服務的基本資訊,包含ip地址、埠號 33 ServiceInstance serviceInstance = this.loadBalancerClient.choose("springcloud-eureka-provider"); 34 // 2、拼接訪問服務的URL。StringBuffer執行緒安全的,StringBuilder執行緒不安全,效率高 35 StringBuilder sb = new StringBuilder(); 36 // 訪問地址,http://127.0.0.1:8080/showUser 37 sb.append("http://").append(serviceInstance.getHost()).append(":").append(serviceInstance.getPort()) 38 .append("showUser"); 39 40 // 3、向URL發送請求。SpringMVC RestTemplate 41 RestTemplate restTemplate = new RestTemplate(); 42 // 處理介面的返回值,參數類型的定義 43 ParameterizedTypeReference<List<User>> parameterizedTypeReference = new ParameterizedTypeReference<List<User>>() { 44 }; 45 46 // 4、封裝了返回值資訊。 47 // 參數1是URL。 48 // 參數2是http請求類型。 49 // 參數3是參數的傳遞。 50 // 參數3是返回值類型的封裝。 51 ResponseEntity<List<User>> responseEntity = restTemplate.exchange(sb.toString(), HttpMethod.GET, null, 52 parameterizedTypeReference); 53 54 // 5、返回調用成功以後的返回值。 55 List<User> list = responseEntity.getBody(); 56 return list; 57 } 58 59 }開發消費端的控制層,可以調用消費端的業務service層。
1 package com.bie.controller; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 import org.springframework.beans.factory.annotation.Autowired; 7 import org.springframework.web.bind.annotation.RequestMapping; 8 import org.springframework.web.bind.annotation.RestController; 9 10 import com.bie.po.User; 11 import com.bie.service.UserService; 12 13 /** 14 * 15 * @author biehl 16 * 17 */ 18 @RestController 19 public class UserController { 20 21 @Autowired 22 private UserService userService; 23 24 @RequestMapping(value = "/consumer") 25 public List<User> getListUser() { 26 List<User> list = new ArrayList<User>(); 27 list = userService.getListUser(); 28 return list; 29 } 30 }啟動你的高可用Eureka Server,啟動你的服務提供方Provider,啟動你的服務消費方Consumer。

然後你發現服務提供方的返回資訊,在服務消費方也可以完全訪問到,從而實現服務的遠程調用。


作者:別先生 部落格園:https://www.cnblogs.com/biehongli/

