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/

Tags: