上篇文章:
Spring Cloud系列—簡介https://blog.csdn.net/sniper_fandc/article/details/149936339?fromshare=blogdetail&sharetype=blogdetail&sharerId=149936339&sharerefer=PC&sharesource=sniper_fandc&sharefrom=from_link
????????在上篇文章中,代碼有一些缺點:
????????1.使用RestTemplate時候URL寫死了,如果服務提供方修改ip,就需要改動代碼。
????????2.如果服務提供方多機部署,ip如何寫。
????????3.返回結果如何共用,不重復寫代碼,并且URL也容易寫錯,如何復用。
????????4.服務提供方的接口實際上是開放的,存在一定風險,應該只對服務調用方開放。
????????上述缺點可以使用服務注冊/發現來解決:
1 服務注冊/發現
????????服務注冊/發現包括三個角色:服務注冊中心、服務消費者、服務提供者:
????????服務注冊中心:保存服務的注冊信息(比如ip),服務節點變更會同步更新。使用相關通信機制保持和服務提供者之間的通信,如果服務提供者無法通信,就會注銷服務實例。
????????服務消費者:調用其它微服務接口的一方。
????????服務提供者:被其它微服務調用接口的一方。
????????服務發現是指服務消費者要調用服務提供方接口時,先去服務注冊中心查詢服務相關信息,比如地址等。
????????服務注冊是指服務提供方啟動時主動向服務注冊中心注冊服務,并定期向注冊中心發送心跳包,匯報自身存活狀態。
2 CAP理論
????????C:一致性(Consistency),指同一時間無論訪問主節點還是從節點獲得的數據是一致的(強一致性,弱一致性是主節點涉及修改后由于同步需要時間,因此存在一定時間的不一致)。
????????A:可用性(Availability),指任何時候訪問系統都有響應,無論響應的數據是否過時或錯誤。
????????P:分區容錯性(Partition Tolerance),指出現網絡分區后(某節點故障),系統仍能提供服務。
????????CAP理論是分布式系統最基礎最關鍵的理論。但是一致性和可用性無法同時滿足,因為要滿足一致性,就需要數據同步時不能訪問系統,這違背了可用性;如果要滿足可用性,有可能訪問過時數據(還未同步的從節點數據),這違背了一致性。因此C和A無法同時滿足。
????????P必須要滿足,因此就出現了CP和CA兩種組合,而常見的注冊中心組件就是選擇了兩種組合中的一種:
Zookeeper | Eureka | Nacos |
滿足CP | 滿足CA | CP或CA(默認CA) |
????????實際上,為用戶提供訪問時,提供過時的數據勝過不提供響應。
3 Eureka
????????Eureka分為Eureka Server和Eureka Client,Eureka Server供注冊中心使用,Eureka Client供服務提供者使用。
3.1 搭建注冊中心
????????由于注冊中心也相當于一個微服務,因此也需要創建一個項目并啟動,這里還是采用父子項目的形式創建,仍然用前面創建的父項目:
????????配置pom文件:
????<dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
????????由于這不需要進行SpringBoot Web開發,因此不需要SpringBoot Web相關依賴。配置SpringBoot配置文件:
server:port: 10010spring:application:name: eureka_servereureka:instance:hostname: localhostclient:fetch-registry: false # 是否從其它Eureka Server獲取注冊信息,默認為true.因為這是一個單點的Eureka Server,不需要同步其他的Eureka Server節點的數據,這里設置為falseregister-with-eureka: false # 是否將自己注冊到Eureka Server,默認為true.由于當前應用就是Eureka Server,故而設置為false.service-url:# 設置與Eureka Server的地址,查詢服務和注冊服務都需要依賴這個地址.defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
????????啟動類:
@EnableEurekaServer@SpringBootApplicationpublic class EurekaServerApplication {public static void main(String[] args) {SpringApplication.run(EurekaServerApplication.class,args);}}
????????這里必須要加@EnableEurekaServer才能成功開啟注冊中心服務。運行代碼結果如下(訪問127.0.0.1:10010):
3.2 服務注冊
????????引入依賴:
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>
????????SpringBoot配置文件:
spring:application:name: product-serviceeureka:client:service-url:defaultZone: http://127.0.0.1:10010/eureka
????????啟動項目,就可以發現該服務已經注冊到Eureka中:
3.3?服務發現
????????引入依賴:
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>
????????SpringBoot配置文件:
spring:application:name: order-serviceeureka:client:service-url:defaultZone: http://127.0.0.1:10010/eureka
????????修改遠程調用代碼:
@Servicepublic class OrderService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate RestTemplate restTemplate;@Autowiredprivate DiscoveryClient discoveryClient;public OrderInfo selectOrderById(Integer orderId) {OrderInfo orderInfo = orderMapper.selectOrderById(orderId);//舊方式//String url = "http://127.0.0.1:8081/product/" + orderInfo.getProductId();//ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);//新方式:通過注冊中心進行服務發現List<ServiceInstance> productService = discoveryClient.getInstances("product-service");EurekaServiceInstance serviceInstance = (EurekaServiceInstance) productService.get(0);String url = serviceInstance.getUri() + "/product/" + orderInfo.getProductId();ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);orderInfo.setProductInfo(productInfo);return orderInfo;}}
????????運行代碼,結果如下:
????????可以發現,配置了注冊中心后,關于服務之間的遠程調用更加靈活方便。
4 Eureka與Zookeeper區別
????????二者都是用于服務注冊和服務發現的,但是也存在很大不同:
????????1.Eureka是Netflix開源項目,Zookeeper是Apache開源項目。
????????2.Eureka基于AP原則,保證高可用性;Zookeeper基于CP原則,保證數據一致性。
????????3.集群環境下,Eureka每個節點地位均等;Zookeeper節點存在地位劃分,主要是Leader、Follower或Observer,這就意味Leader節點故障需要進行重新選舉Leader,存在一定時間的服務不可用。
下篇文章:
Spring Cloud系列—LoadBalance負載均衡https://blog.csdn.net/sniper_fandc/article/details/149938185?fromshare=blogdetail&sharetype=blogdetail&sharerId=149938185&sharerefer=PC&sharesource=sniper_fandc&sharefrom=from_link