所謂服務註冊中心就是在整個的微服務架構中單獨提出一個服務,這個服務不完成系統的任何的業務功能,僅僅用來完成對整個微服務系統的服務註冊和服務發現,以及對服務健康狀態的監控和管理功能。java
服務註冊中心node
springcloud支持的多種註冊中心Eureka(netflix)、Consul、Zookeeper、以及阿里巴巴推出Nacos組件。git
這些註冊中心在本質上都是用來管理服務的註冊和發現以及服務狀態的檢查的。github
# 0.簡介 - https://github.com/Netflix/eureka/wiki - Eureka是Netflix開發的服務發現框架,自己是一個基於REST的服務。SpringCloud將它集成在其子項目spring-cloud-netflix中,以實現SpringCloud的服務註冊和發現功能。 Eureka包含兩個組件:Eureka Server和Eureka Client。
單體應用 ------> 分類服務 商品服務 訂單服務 用戶服務......web
Eureka Server 組件 : 服務註冊中心組件 管理全部服務 支持全部服務註冊算法
Eureka Client 組件 : 分類服務 商品服務 訂單服務(微服務)spring
開發Eureka Serverapache
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.5.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.md</groupId> <artifactId>02-eurekaserver8761</artifactId> <version>0.0.1-SNAPSHOT</version> <name>02-eurekaserver8761</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> <!--定義springcloud使用版本號--> <spring-cloud.version>Hoxton.SR6</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!--引入 eureka server--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies> <!--全局管理springcloud版本,並不會引入具體依賴--> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
server.port=8761 #執行服務端口 spring.application.name=eurekaserver #指定服務名稱 惟一標識 eureka.client.service-url.defaultZone=http://localhost:8761/eureka #指定服務註冊中心的地址
@SpringBootApplication @EnableEurekaServer public class Eurekaserver8761Application { public static void main(String[] args) { SpringApplication.run(Eurekaserver8761Application.class, args); } }
eureka server 服務註冊中心 & client 微服務windows
仍是在application.properties瀏覽器
server.port=8761 spring.application.name=eurekaserver eureka.client.service-url.defaultZone=http://localhost:8761/eureka eureka.client.register-with-eureka=false #再也不將本身同時做爲客戶端進行註冊 eureka.client.fetch-registry=false #關閉做爲客戶端時從eureka server獲取服務信息
開發Eureka Client
項目拆分出來的一個個微服務
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.5.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.md</groupId> <artifactId>02-eurekaserver8888</artifactId> <version>0.0.1-SNAPSHOT</version> <name>02-eurekaserver8888</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> <!--定義springcloud使用版本號--> <spring-cloud.version>Hoxton.SR6</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!--引入eureka client--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> </dependencies> <!--全局管理springcloud版本,並不會引入具體依賴--> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
server.port=8888 spring.application.name=eurekaclient8888 #服務名稱惟一標識 eureka.client.service-url.defaultZone=http://localhost:8761/eureka #eureka註冊中心地址
@SpringBootApplication @EnableEurekaClient public class Eurekaclient8888Application { public static void main(String[] args) { SpringApplication.run(Eurekaclient8888Application.class, args); } }
# 0.服務頻繁啓動時 EurekaServer出現警告 - EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.
1.自我保護機制
2.在eureka server端關閉自我保護機制
eureka.server.enable-self-preservation=false #關閉自我保護 eureka.server.eviction-interval-timer-in-ms=3000 #超時3s自動清除
3.微服務修改減短服務心跳的時間
eureka.instance.lease-expiration-duration-in-seconds=10 #用來修改eureka server默認接受心跳的最大時間 默認是90s eureka.instance.lease-renewal-interval-in-seconds=5 #指定客戶端多久向eureka server發送一次心跳 默認是30s
4.儘管如此關閉自我保護機制仍是會出現警告
7.eureka 中止更新
# 1.官方中止更新說明 - https://github.com/Netflix/eureka/wiki - 在1.x版本項目仍是活躍的,可是在2.x版本中中止維護,出現問題後果自負!!!
consul 服務註冊中心 啓動consul服務註冊中心 運行
consul 客戶端 將springcloud 客戶端(微服務)
consul 簡介
windows下啓動consul
consul的服務端
# 1.建立boot項目並引入consul客戶端依賴
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.5.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.md</groupId> <artifactId>03-consulclient8889</artifactId> <version>0.0.1-SNAPSHOT</version> <name>03-consulclient8889</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> <!--定義springcloud使用版本號--> <spring-cloud.version>Hoxton.SR6</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!--引入consul依賴--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency> </dependencies> <!--全局管理springcloud版本,並不會引入具體依賴--> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
# 2.編寫properties配置
server.port=8889 spring.application.name=consulclient8889 spring.cloud.consul.host=localhost #註冊consul服務的主機 spring.cloud.consul.port=8500 #註冊consul服務的端口號
# 3.啓動服務查看consul界面服務信息
# 1.開啓consul健康監控 - 默認狀況加consul監控健康是開啓的,可是必須依賴健康監控依賴才能正確監控健康狀態因此直接啓動會顯示錯誤,引入健康監控依賴以後服務正常
<!-- 這個包是用作健康度監控的--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
server.port=8889 spring.application.name=consulclient8889 spring.cloud.consul.host=localhost #註冊consul服務的主機 spring.cloud.consul.port=8500 #註冊consul服務的端口號 spring.cloud.consul.discovery.register-health-check=false #關閉consu了服務的健康檢查[不推薦] spring.cloud.consul.discovery.service-name=${spring.application.name} #指定註冊的服務名稱 默認就是應用名
服務註冊中心集羣 node1 node2 node3 ... eureka(AP) consul zk(CP)