服務註冊中心是服務實現服務化管理的核心組件,相似於目錄服務的做用,主要用來存儲服務信息,譬如提供者url串、路由信息等。服務註冊中心是SOA架構中最基礎的設施之一。html
1,服務的註冊java
2,服務的發現web
1,Dubbo 的註冊中心Zookeeper算法
2,Sringcloud的註冊中心Eurekaspring
Eureka是Netflix開發的服務發現組件,自己是一個基於REST的服務。Spring Cloud將它集成在其子項目spring-cloud-netflix中,以實現Spring Cloud的服務註冊於發現,同時還提供了負載均衡、故障轉移等能力。apache
經過Register、Get、Renew等接口提供服務的註冊和發現。瀏覽器
服務提供方緩存
把自身的服務實例註冊到Eureka Server中安全
服務調用方服務器
經過Eureka Server 獲取服務列表,消費服務。
一、建立項目
二、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服務管理平臺
在微服務架構中,註冊中心是一個必不可少的組件,前面咱們搭建的註冊中心只適合本地開發使用,在生產環境必須搭建一個集羣來保證高可用。
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/
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 }
先啓動服務器,再啓動客戶端:
(一)搭建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.啓動項目並測試
一、在什麼條件下,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
一、在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