java B2B2C springmvc mybatis电子商务平台源码-服务的注册与发现(Eureka)
1、介紹
對于微服務的治理而言,其核心就是服務的注冊和發現。在SpringCloud 中提供了多種服務注冊與發現組件:Eureka,Consul,Zookeeper。官方推薦使用Eureka。
需要JAVA Spring Cloud大型企業分布式微服務云構建的B2B2C電子商務平臺源碼 一零三八七七四六二六
說明:Eureka是Netflix開源的一款提供服務注冊和發現的產品,它提供了完整的Service Registry和Service Discovery實現。也是springcloud體系中最重要最核心的組件之一。管理的服務包含了Spring Cloud的其他服務組件如:熔斷、負載、降級等。
2、理解
以往服務間資源的獲取都是通過相互調用,比如A獲取B相關資源,A調用B提供的API獲取相關資源 。加入Eureka之后,則B提供服務資源需要在Eureka服務中心注冊一遍,A獲取服務資源也需要在Eureka服務中心注冊一遍,從而獲取B服務的資源。監控Eureka服務中心可以監控AB服務調用的使用情況。
3、核心內容
上文說過,對于服務治理而言,其核心部分就是服務的發現與注冊,而Spring Cloud推薦使用的是Eureka。因為在分布式系統中,有一個CAP定理,即 Consistency(一致性)、 Availability(可用性)、Partition tolerance(分區容錯性),三者不可兼得。Zookeeper是Hadoop的子項目,它的作用也多作為服務的發現與注冊。 Zookeeper在CAP定理中滿足的CP,也就是一致性和分區容錯性,但是它不能保證服務的可用性。比如,服務消費者通過注冊列表獲取數據時,倘若,Zookeeper正在選主導致服務不可用,亦或者大多數服務宕機。在一般分布式系統的數據存儲場景,數據一致性應該是首先被保證的。然而在服務發現的場景中,服務消費者能夠消費才是首先保證的,即服務的可用性才是首先保證。
3.1、Eureka組件
Eureka由多個instance(服務實例)組成,這些服務實例可以分為兩種:Eureka Server和Eureka Client。為了便于理解,我們將Eureka client再分為Service Provider(服務提供者)和Service Consumer(服務消費者)。
Eureka Server:服務的注冊中心,負責維護注冊的服務列表。
Service Provider:服務提供方,作為一個Eureka Client,向Eureka Server做服務注冊、續約和下線等操作,注冊的主要數據包括服務名、機器ip、端口號、域名等等。
Service Consumer:服務消費方,作為一個Eureka Client,向Eureka Server獲取Service Provider的注冊信息,并通過遠程調用與Service Provider進行通信。
3.2、Eureka Server
Eureka Server作為一個獨立的部署單元,以REST API的形式為服務實例提供了注冊、管理和查詢等操作。同時,Eureka Server也為我們提供了可視化的監控頁面,可以直觀地看到各個Eureka Server當前的運行狀態和所有已注冊服務的情況。
Eureka Server節點啟動后,會首先嘗試從鄰近節點獲取所有實例注冊表信息,完成初始化。Eureka Server通過getEurekaServiceUrls()方法獲取所有的節點,并且會通過心跳續約的方式定期更新。 默認配置下,如果Eureka Server在一定時間內沒有接收到某個服務實例的心跳,Eureka Server將會注銷該實例(默認為90秒,通過eureka.instance.lease-expiration-duration-in-seconds配置)。當Eureka Server節點在短時間內丟失過多的心跳時(比如發生了網絡分區故障),那么這個節點就會進入自我保護模式。
自我保護模式: 默認配置下,如果Eureka Server每分鐘收到心跳續約的數量低于一個閾值(instance的數量(60/每個instance的心跳間隔秒數)自我保護系數),并且持續15分鐘,就會觸發自我保護。在自我保護模式中,Eureka Server會保護服務注冊表中的信息,不再注銷任何服務實例。當它收到的心跳數重新恢復到閾值以上時,該Eureka Server節點就會自動退出自我保護模式。它的設計理念就是寧可保留錯誤的服務注冊信息,也不盲目注銷任何可能健康的服務實例。該模式可以通過eureka.server.enable-self-preservation = false來禁用,同時eureka.instance.lease-renewal-interval-in-seconds可以用來更改心跳間隔,eureka.server.renewal-percent-threshold可以用來修改自我保護系數(默認0.85)。
3.3、Eureka Client
服務注冊 :啟動時,會調用服務注冊方法,向Eureka Server注冊自己的信息。Eureka Server會維護一個已注冊服務的列表。當實例狀態發生變化時(如自身檢測認為Down的時候),也會向Eureka Server更新自己的服務狀態,同時用replicateToPeers()向其它Eureka Server節點做狀態同步。
續約與剔除 :服務實例啟動后,會周期性地向Eureka Server發送心跳以續約自己的信息,避免自己的注冊信息被剔除。續約的方式與服務注冊基本一致,首先更新自身狀態,再同步到其它Peer。如果Eureka Server在一段時間內沒有接收到某個微服務節點的心跳,Eureka Server將會注銷該微服務節點(自我保護模式除外)。
服務消費 :Service Consumer本質上也是一個Eureka Client。它啟動后,會從Eureka Server上獲取所有實例的注冊信息,包括IP地址、端口等,并緩存到本地。這些信息默認每30秒更新一次。前文提到過,如果與Eureka Server通信中斷,Service Consumer仍然可以通過本地緩存與Service Provider通信。
三處緩存:
Eureka Server對注冊列表進行緩存,默認時間為30s。
Eureka Client對獲取到的注冊信息進行緩存,默認時間為30s。
Ribbon會從上面提到的Eureka Client獲取服務列表,將負載均衡后的結果緩存30s。
4、代碼實現
我們做三個角色
Eureka Server :提供服務注冊和發現;
Service Provider :服務提供方,將自身服務注冊到Eureka,從而使服務消費方能夠找到;
Service Consumer: 服務消費方,從Eureka獲取注冊服務列表,從而能夠消費服務。
5、Eureka Server
maven項目的pom.xml文件
<groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.6.RELEASE</version> <relativePath/> </parent><properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring-cloud.version>Dalston.SR2</spring-cloud.version> </properties><dependencies> <!--Eureka服務端--> <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope> </dependency> </dependencies><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> 復制代碼項目的啟動配置文件:application.properties
spring.application.name=eureka-server server.port=8761 eureka.client.register-with-eureka=false eureka.client.fetch-registry=false eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/ 復制代碼配置說明:其中serviceUrl代表注冊中心,集群多個,逗號分隔,fetch-registry(默認開啟)表示從注冊中中心獲取服務;register-with-eureka(默認開啟):是否將自身注冊到服務中心。
開啟Eureka服務:
@EnableEurekaServer @SpringBootApplication public class EurekaServerApplication {public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args);} } 復制代碼6、Eureka Provider
maven項目的pom.xml文件:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.6.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent><properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring-cloud.version>Dalston.SR2</spring-cloud.version> </properties><dependencies> <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</artifactId> </dependency><!-- spring boot實現Java Web服務--> <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></dependencies><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> 復制代碼項目啟動配置文件application.properties:
#應用(服務)名稱 spring.application.name=eureka-provider server.port=8762 eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/ 復制代碼注解@EnableDiscoveryClient服務化:
@EnableDiscoveryClient @SpringBootApplication public class EurekaProviderApplication {public static void main(String[] args) { new SpringApplicationBuilder(EurekaProviderApplication.class).web(true).run(args); }} 復制代碼訪問控制器:
@RestController public class ProviderNode1Controller {@GetMapping({"","/"}) public String index(){ return "Hi,dy_bom! this is provider-node1 of peer!";} 復制代碼7、Eureka與Spring Cloud Security 結合做權限認證
在pom.xml中加入Security的依賴
<!--權限認證--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId> </dependency> 復制代碼properties定義權限的用戶名密碼
#權限認證(默認就是開啟的) security:basic:enabled: trueuser:name: eurekapassword: 123456 復制代碼8、Eureka集群
properties配置文件
#對等意識,集群Eureka服務器配置 --- spring:application:name: spring-cloud-eurekaprofiles: peer1 server:port: 8001eureka:instance:hostname: peer1client: serviceUrl:defaultZone: http://peer2:8002/eureka/,http://peer3:8003/eureka/ --- spring:application:name: spring-cloud-eurekaprofiles: peer2 server:port: 8002 eureka:instance:hostname: peer2client: serviceUrl:defaultZone: http://peer1:8001/eureka/,http://peer3:8003/eureka/ --- spring:application:name: spring-cloud-eurekaprofiles: peer3 server:port: 8003 eureka:instance:hostname: peer3client: serviceUrl:defaultZone: http://peer1:8001/eureka/,http://peer2:8001/eureka/ 復制代碼啟動后,我們可以看到三個節點是兩兩互相注冊的。各個節點沒有主次之分,對等。
java B2B2C springmvc mybatis電子商務平臺源碼
轉載于:https://juejin.im/post/5ca47bc9f265da309c584871
總結
以上是生活随笔為你收集整理的java B2B2C springmvc mybatis电子商务平台源码-服务的注册与发现(Eureka)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深入解析go依赖注入库go.uber.o
- 下一篇: 计算机英语课外知识竞赛,高2012级英语