Springboot2.x整合SpringCloud之Eureka服務註冊中心

1、 什麼是服務註冊中心

        服務註冊中心是服務實現服務化管理的核心組件,相似於目錄服務的做用,主要用來存儲服務信息譬如提供者url串、路由信息等。服務註冊中心是SOA架構中最基礎的設施之一。html

服務註冊中心的做用

  1,服務的註冊java

  2,服務的發現web

2. 常見的註冊中心有哪些

  1,Dubbo 的註冊中心Zookeeper算法

  2,Sringcloud的註冊中心Eurekaspring

3. 服務註冊中心解決了什麼問題

  1. 服務管理;
  2. 服務的依賴關係管理;

4. 什麼是Eureka註冊中心

EurekaNetflix開發的服務發現組件,自己是一個基於REST的服務。Spring Cloud將它集成在其子項目spring-cloud-netflix中,以實現Spring Cloud的服務註冊於發現,同時還提供了負載均衡、故障轉移等能力。apache

5. Eureka註冊中心三種角色

5.1 Eureka Server

  經過RegisterGetRenew等接口提供服務的註冊和發現。瀏覽器

5.2 Application Service (Service Provider)

    服務提供方緩存

 把自身的服務實例註冊到Eureka Server安全

5.3 Application Client (Service Consumer)

    服務調用方服務器

 經過Eureka Server 獲取服務列表,消費服務。

2、 Eureka入門案例

一、建立項目

 

二、pom.xml文件以下

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
 4     <modelVersion>4.0.0</modelVersion>
 5     <parent>
 6         <groupId>org.springframework.boot</groupId>
 7         <artifactId>spring-boot-starter-parent</artifactId>
 8         <version>2.1.9.RELEASE</version>
 9         <relativePath/> <!-- lookup parent from repository -->
10     </parent>
11     <groupId>com.angei</groupId>
12     <artifactId>eurekaserver</artifactId>
13     <version>0.0.1-SNAPSHOT</version>
14     <name>eurekaserver</name>
15     <description>Demo project for Spring Boot</description>
16 
17     <properties>
18         <java.version>1.8</java.version>
19         <spring-cloud.version>Greenwich.SR3</spring-cloud.version>
20     </properties>
21 
22     <dependencies>
23         <dependency>
24             <groupId>org.springframework.cloud</groupId>
25             <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
26         </dependency>
27 
28         <dependency>
29             <groupId>org.springframework.boot</groupId>
30             <artifactId>spring-boot-starter-test</artifactId>
31             <scope>test</scope>
32         </dependency>
33     </dependencies>
34 
35     <dependencyManagement>
36         <dependencies>
37             <dependency>
38                 <groupId>org.springframework.cloud</groupId>
39                 <artifactId>spring-cloud-dependencies</artifactId>
40                 <version>${spring-cloud.version}</version>
41                 <type>pom</type>
42                 <scope>import</scope>
43             </dependency>
44         </dependencies>
45     </dependencyManagement>
46 
47     <build>
48         <plugins>
49             <plugin>
50                 <groupId>org.springframework.boot</groupId>
51                 <artifactId>spring-boot-maven-plugin</artifactId>
52             </plugin>
53         </plugins>
54     </build>
55 
56 </project>

提示:若是IDEA加載pom.xml時一直下載失敗,能夠在pom.xml中添加以下配置,使其從國內阿里雲鏡像中下載相關內容,下載速率將會大幅提高。

<repositories>
    <repository>
        <id>aliyun</id>    
        <name>aliyun</name>    
        <url>https://maven.aliyun.com/repository/public</url>    
    </repository>    
</repositories>

三、添加application.yml全局配置文件

 1 server:
 2   port: 8761
 3 eureka:
 4   instance:
 5     appname: provider-service
 6     hostname: localhost
 7   client:
 8     service-url:
 9       defaultZone:
10         http://localhost:8761/eureka/
11     register-with-eureka: false
12     fetch-registry: false

說明:

 1 server:
 2   port: 8761
 3 eureka:
 4   instance:
 5     #服務名,默認取 spring.application.name 配置值,若是沒有則爲 unknown
 6     appname: provider-service
 7     #設置當前實例的主機名稱
 8     hostname: localhost
 9   client:
10     service-url: 
11       #指定服務註冊中心地址,類型爲 HashMap,並設置有一組默認值,
12       #默認的Key爲 defaultZone;默認的Value爲 http://localhost:8761/eureka ,
13       #若是服務註冊中心爲高可用集羣時,多個註冊中心地址以逗號分隔。
14       defaultZone:
15         http://localhost:8761/eureka/
16 
17     #是否將本身註冊到Eureka-Server中,默認的爲true
18     register-with-eureka: false
19 
20     #是否從Eureka-Server中獲取服務註冊信息,默認爲true
21     fetch-registry: false

附:Spring Cloud Eureka 經常使用配置及說明

四、修改啓動類

 1 import org.springframework.boot.SpringApplication;
 2 import org.springframework.boot.autoconfigure.SpringBootApplication;
 3 import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
 4 
 5 @SpringBootApplication
 6 @EnableEurekaServer
 7 public class EurekaserverApplication {
 8 
 9     public static void main(String[] args) {
10         SpringApplication.run(EurekaserverApplication.class, args);
11     }
12 
13 }

五、經過瀏覽器訪問Eureka-Server服務管理平臺

 

3、 搭建高可用Eureka註冊中心(Eureka集羣)

在微服務架構中,註冊中心是一個必不可少的組件,前面咱們搭建的註冊中心只適合本地開發使用,在生產環境必須搭建一個集羣來保證高可用。

Eureka的集羣搭建很簡單,每一臺Eureka都須要在配置中指定另外N個Eureka的地址就能夠。

在Eureka服務端的配置項eureka.client.serviceUrl.defaultZone中地址那一行要使用ip或域名,因爲這裏是在本地一臺機子上模擬集羣環境,ip地址都同樣,因此經過更改本地host文件的方式建立三個可用的域名。

1.修改C:\Windows\System32\drivers\etc\hosts文件:

127.0.0.1 server1
127.0.0.1 server2
127.0.0.1 server3

2.本地刷新dns:

指令: ipconfig /flushdns

 

 

3.建立3個application.yml

application-p8761.yml

server:
  port: 8761
eureka:
  instance:
    #服務名,默認取 spring.application.name 配置值,若是沒有則爲 unknown
    appname: provider-service
    #設置當前實例的主機名稱
    hostname: server1
  client:
    service-url:
      #指定服務註冊中心地址,類型爲 HashMap,並設置有一組默認值, #默認的Key爲 defaultZone;默認的Value爲 http://localhost:8761/eureka ,
 #若是服務註冊中心爲高可用集羣時,多個註冊中心地址以逗號分隔,地址形式是ip或域名:端口號
      defaultZone:
        http://server2:8762/eureka/,http://server3:8763/eureka/

application-p8762.yml

server:
  port: 8762
eureka:
  instance:
    appname: provider-service
    hostname: server2
  client:
    service-url:
      defaultZone:
        http://server1:8761/eureka/,http://server3:8763/eureka/

application-p8763.yml

server:
  port: 8763
eureka:
  instance:
    appname: provider-service
    hostname: server3
  client:
    service-url:
      defaultZone:
        http://server1:8761/eureka/,http://server2:8762/eureka/

4.而後須要注意,application-xxxx.yml不是默認的配置形式,是沒法被自動識別的,能夠經過配置spring.profiles.active的方式指定運行時加載。

 5.分別啓動pEurekaServerApplication-8761, EurekaServerApplication-8762, EurekaServerApplication-8763

 顯示以下:

6.同時,在客戶端的配置項中設置服務註冊中心地址時,設置爲哪個均可以,最好都寫上(用逗號隔開),這樣當其中一個節點掛了,客戶端還會自動嘗試鏈接其餘節點。

server:
  port: 80
spring:
  application:
    name: order-service
eureka:
  client:
    service-url:
      #設置服務註冊中心地址
      defaultZone:
        http://localhost:8761/eureka/,http://localhost:8762/eureka/,http://localhost:8763/eureka/

 

4、 在Eureka註冊中心中構建客戶端服務

Eureka客戶端開發要點:
   ①、maven 依賴 spring-cloud-starter-netflix-eureka-client;
   ②、application.yml 配置 eureka.client.service-url.defaultZone;
   ③、入口類増加 @EnableEurekaClient;

一、建立項目

 

 

二、pom.xml文件以下

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
 4     <modelVersion>4.0.0</modelVersion>
 5     <parent>
 6         <groupId>org.springframework.boot</groupId>
 7         <artifactId>spring-boot-starter-parent</artifactId>
 8         <version>2.1.9.RELEASE</version>
 9         <relativePath/> <!-- lookup parent from repository -->
10     </parent>
11     <groupId>com.angei</groupId>
12     <artifactId>eureka-client</artifactId>
13     <version>0.0.1-SNAPSHOT</version>
14     <name>eureka-client</name>
15     <description>Demo project for Spring Boot</description>
16 
17     <properties>
18         <java.version>1.8</java.version>
19         <spring-cloud.version>Greenwich.SR3</spring-cloud.version>
20     </properties>
21 
22     <dependencies>
23         <dependency>
24             <groupId>org.springframework.boot</groupId>
25             <artifactId>spring-boot-starter-web</artifactId>
26         </dependency>
27         <dependency>
28             <groupId>org.springframework.cloud</groupId>
29             <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
30         </dependency>
31 
32         <dependency>
33             <groupId>org.springframework.boot</groupId>
34             <artifactId>spring-boot-starter-test</artifactId>
35             <scope>test</scope>
36         </dependency>
37     </dependencies>
38 
39     <dependencyManagement>
40         <dependencies>
41             <dependency>
42                 <groupId>org.springframework.cloud</groupId>
43                 <artifactId>spring-cloud-dependencies</artifactId>
44                 <version>${spring-cloud.version}</version>
45                 <type>pom</type>
46                 <scope>import</scope>
47             </dependency>
48         </dependencies>
49     </dependencyManagement>
50 
51     <build>
52         <plugins>
53             <plugin>
54                 <groupId>org.springframework.boot</groupId>
55                 <artifactId>spring-boot-maven-plugin</artifactId>
56             </plugin>
57         </plugins>
58     </build>
59 
60 </project>

三、添加application.yml全局配置文件

 1 server:
 2   port: 80
 3 spring:
 4   application:
 5     name: order-service
 6 eureka:
 7   client:
 8     service-url:
 9       #設置服務註冊中心地址
10       defaultZone:
11         http://localhost:8761/eureka/

四、修改啓動類

 1 import org.springframework.boot.SpringApplication;
 2 import org.springframework.boot.autoconfigure.SpringBootApplication;
 3 import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
 4 
 5 @SpringBootApplication
 6 @EnableEurekaClient
 7 public class EurekaClientApplication {
 8     public static void main(String[] args) {
 9         SpringApplication.run(EurekaClientApplication.class, args);
10     }
11 }

五、測試

 1 package com.angei.eurekaclient.Controller;
 2 
 3 import org.springframework.stereotype.Controller;
 4 import org.springframework.web.bind.annotation.GetMapping;
 5 import org.springframework.web.bind.annotation.PathVariable;
 6 import org.springframework.web.bind.annotation.ResponseBody;
 7 
 8 @Controller
 9 public class orderController {
10 
11     @GetMapping("/order/{id}")
12     @ResponseBody
13     public String findById(@PathVariable("id") Integer orderId){
14         if(orderId==2019){
15             return "{\"Id\":1,\"Title\":\"餓了麼訂單\"}";
16         }else{
17             return null;
18         }
19     }
20 }

先啓動服務器,再啓動客戶端:

 

5、 在高可用的Eureka註冊中心中模擬構建provider服務和consumer服務

(一)搭建provider提供服務

1.搭載環境

 

 

 配置application.properties,將服務註冊到註冊中心。

spring.application.name=eureka-provider
server.port=9090
#設置服務註冊中心地址
eureka.client.serviceUrl.defaultZone=http://server1:8761/eureka/,http://server2:8762/eureka/,http://server3:8763/eureka/

2.模擬提供服務

建立User實體類:

 1 import lombok.Getter;
 2 import lombok.Setter;
 3 import java.io.Serializable;
 4 
 5 @Getter
 6 @Setter
 7 public class User implements Serializable {
 8 
 9     private int id;
10 
11     private String name;
12 
13     public User() {
14     }
15 
16     public User(int id, String name) {
17         this.id = id;
18         this.name = name;
19     }
20 
21     @Override
22     public String toString() {
23         return "學號:" + this.id + "\t姓名:" + this.name;
24     }
25 }

建立userController:

 1 import com.example.demo.pojo.User;
 2 import org.springframework.stereotype.Controller;
 3 import org.springframework.web.bind.annotation.RequestMapping;
 4 import org.springframework.web.bind.annotation.RestController;
 5 
 6 import java.util.ArrayList;
 7 
 8 @Controller
 9 @RestController
10 public class userController {
11 
12     @RequestMapping("/getAllUser")
13     public ArrayList<User> getAllUser() {
14         ArrayList<User> list = new ArrayList<>();
15         list.add(new User(2018, "Benjieming"));
16         list.add(new User(2019, "Huangsi"));
17         list.add(new User(2020, "Yangyi"));
18         return list;
19 
20     }
21 }

3.啓動項目並檢測

 

(二)  搭建consumer調用服務

1.建立項目,過程同provider,最終項目結構以下:

application.yml內容以下:

server:
  port: 9091
spring:
  application:
    name: eureka-consumer
eureka:
  client:
    service-url:
      #設置服務註冊中心地址
      defaultZone:
        http://server1:8761/eureka/,http://server2:8762/eureka/,http://server3:8763/eureka/

2.建立userService和userController

userService.java

 1 package com.angei.eurekaclient.Service;
 2 
 3 import com.angei.eurekaclient.pojo.User;
 4 import org.springframework.beans.factory.annotation.Autowired;
 5 import org.springframework.cloud.client.ServiceInstance;
 6 import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
 7 import org.springframework.core.ParameterizedTypeReference;
 8 import org.springframework.http.HttpMethod;
 9 import org.springframework.http.ResponseEntity;
10 import org.springframework.stereotype.Service;
11 import org.springframework.web.client.RestTemplate;
12 
13 import java.util.List;
14 
15 @Service
16 public class userService {
17 
18     @Autowired
19     private LoadBalancerClient loadBalancerClient;//ribbon負載均衡器
20 
21     public List<User> getUsers() {
22 
23         //選擇調用的服務的名稱
24         //ServiceInstance類封裝了服務的基本信息,如 IP,端口等
25         ServiceInstance si = this.loadBalancerClient.choose("eureka-provider");
26         //拼接訪問服務的URL
27         StringBuffer sb = new StringBuffer();
28         //http://server1:8761/getAllUser
29         System.out.println("host:" + si.getHost());
30         System.out.println("Port:" + si.getPort());
31         sb.append("http://").append(si.getHost()).append(":").append(si.getPort()).append("/getAllUser");
32 
33 
34         //springMVC RestTemplate
35         RestTemplate rt = new RestTemplate();
36 
37         ParameterizedTypeReference<List<User>> type = new ParameterizedTypeReference<List<User>>() {
38         };
39 
40         //ResponseEntity:封裝了返回值信息
41         ResponseEntity<List<User>> response = rt.exchange(sb.toString(), HttpMethod.GET, null, type);
42         List<User> list = response.getBody();
43         return list;
44     }
45 }

注意:這裏是向註冊中心獲取服務並拉取信息。

userController.java

 1 package com.angei.eurekaclient.Controller;
 2 
 3 import com.angei.eurekaclient.Service.userService;
 4 import com.angei.eurekaclient.pojo.User;
 5 import org.springframework.web.bind.annotation.RequestMapping;
 6 import org.springframework.web.bind.annotation.RestController;
 7 
 8 import javax.annotation.Resource;
 9 import java.util.List;
10 
11 @RestController
12 public class userController {
13 
14     @Resource
15     private userService userservice;
16 
17     @RequestMapping("/getAllUsers")
18     public List<User> getUsers(){
19         return userservice.getUsers();
20     }
21 }

3.啓動項目並測試

 

 

 

5、 Eureka註冊中心架構原理

 

6、 Eureka優雅停服

一、在什麼條件下,Eureka會啓動自我保護?

什麼是自我保護模式

1,自我保護的條件
   通常狀況下,微服務在Eureka上註冊後,會每30秒發送心跳包,Eureka經過心跳來判斷服務是否健康,同時會按期刪除超過90秒沒有發送心跳服務。
2,有兩種狀況會致使Eureka Server收不到微服務的心跳
   a.是微服務自身的緣由;
   b.是微服務與Eureka之間的網絡故障;
   一般微服務的自身的故障關閉只會致使個別服務出現故障,通常不會出現大面積故障,而網絡故障一般會致使Eureka Server在短期內沒法收到大批心跳。
   考慮到這個區別,Eureka設置了一個閥值,當判斷掛掉的服務的數量超過閥值時,Eureka Server認爲很大程度上出現了網絡故障,將再也不刪除心跳過時的服務。
3,那麼這個閥值是多少呢?
   15分鐘以內故障率是否低於85%;
   Eureka Server在運行期間,會統計心跳失敗的比例在15分鐘內是否低於85%,
   這種算法叫作Eureka Server的自我保護模式。

二、爲何要啓動自我保護?

爲何要自我保護

    1,由於同時保留"好數據"與"壞數據"總比丟掉任何數據要更好,當網絡故障恢復後,這個Eureka節點會退出"自我保護模式"。
    2,Eureka還有客戶端緩存功能(也就是微服務的緩存功能)。即使Eureka集羣中全部節點都宕機失效,微服務的Provider和Consumer都能正常通訊。
    3,微服務的負載均衡策略會自動剔除死亡的微服務節點。

三、如何關閉自我保護?

修改Eureka Server配置文件

#關閉自我保護:true爲開啓自我保護,false爲關閉自我保護
eureka.server.enableSelfPreservation=false
#清理間隔(單位:毫秒,默認是60*1000)
eureka.server.eviction.interval-timer-in-ms=60000

 

7、 如何增強Eureka註冊的安全認證

一、在Eureka Server中添加security的依賴包

<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-security</artifactId>
</dependency>

二、修改Eureka的Server配置文件 

#開啓http basic的安全認證
security.basic.enabled=true  
security.user.name=user
security.user.password=123456

三、修改Eureka集羣節點之間互相訪問的url值

eureka.client.serviceUrl.defaultZone=http://user:123456@server2:8762/eureka/, http://user:123456@server3:8763/eureka/

四、修改微服務的配置文件添加訪問註冊中心的用戶名與密碼

spring.application.name=eureka-provider
server.port=9090

#設置服務註冊中心地址,指向另外一個註冊中心
eureka.client.serviceUrl.defaultZone=http://user:123456@server1:8761/eureka/, http://user:123456@server2:8762/eureka/, http://user:123456@server3:8763/eureka/

#啓用shutdown
endpoints.shutdown.enabled=true
#禁用密碼驗證
endpoints.shutdown.sensitive=false
相關文章
相關標籤/搜索