目錄
一、背景
1、概念
2、CAP 理論
3、常見的注冊中心
二、Eureka
三、搭建 Eureka Server
1、搭建注冊中心
四、服務注冊
五、服務發現
六、Eureka 和 Zooper 的區別
一、背景
1、概念
遠程調用就類似于一種通信
例如:當游客與景區之間進行通信(電話的方式),此時游客需要得到景區的電話,例如通過景區官網或者 114 查號臺進行查詢
那么 114 平臺又是如何知道景區和電話的關系的呢?
景區當創建和修改的時候告訴 114 平臺,由 114 平臺對信息進行維護,游客就可以通過 114 查詢電話,再向景區進行通訊
上述的解決方案同樣也適用于微服務中
在微服務中,有兩個角色:服務消費者和服務提供者
當訂單服務調用商品服務,從中獲取到對應的商品信息,此時訂單服務就是服務消費者,商品服務就是服務提供者
服務提供者在啟動之初,向平臺進行注冊,告訴平臺 應用 和 IP 的關系,服務消費者可以從平臺中根據應用獲取到 IP 地址,然后根據 IP 地址進行遠程調用
服務提供者和注冊中心的關系我們稱之為服務注冊,服務消費者和注冊中心的關系稱為服務發現
我們來看一下這三種角色分別的作用:
注意:服務提供者和服務消費者是相對的概念!!!
服務注冊和服務發現的解釋:
2、CAP 理論
CAP 理論是分布式系統中最基礎、最關鍵的理論
我們來看一下 CAP 理論的圖:
C:Consistency 一致性(此處的一致性指的是強一致性)
A:Availability 可用性 (對所有請求都有響應,這個響應可能是錯誤的數據)
P:Partition tolerance 分區容錯性(在網絡分區的情況下,我們的系統依然可以對外提供服務)
例如:銀行利率下調,這個通知需要下發到各個銀行的工作人員,通知下發需要一定的時間
一致性:在相同的時間點,所有的工作人員對客戶講的利率都是一樣的
可用性:不論何時,所有的銀行工作人員對客戶咨詢利率都是有回復的(回復也有可能是舊利率)
分區容錯性:如果其中一個工作人員請假了,銀行仍然可以對外提供服務
在分布式系統中,P 必須要保證,所以 C 和 A 只能二選一,因此我們的架構就是 AP / CP 架構
CP架構: 為了保證分布式系統對外的數據?致性, 于是選擇不返回任何數據
AP架構: 為了保證分布式系統的可?性, 節點2返回V0版本的數據(即使這個數據不正確)
什么是強一致性?
數據庫集群分為主庫和從庫
客戶端向數據庫集群發送了一個數據修改的請求,數據庫集群需要向客戶端進行響應,響應的時機分為以下兩種:
1、主庫接收到請求,并處理成功,此時數據還未完全同步到從庫,隨著時間的推移,主庫和從庫的數據最終達到一致性
2、主庫接收到請求,并且所有從庫數據同步成功時,數據庫集群才進行響應?
強一致性:主庫和從庫,無論何時對外提供的服務都是一致的【第二種情況】
弱一致性:隨著時間的推移,最終達到了一致性【第一種情況】
3、常見的注冊中心
二、Eureka
等),Eureka Server 會存儲這些信息
三、搭建 Eureka Server
1、搭建注冊中心
(1)創建項目
(2)pom 中加入 Eureka 的依賴
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
(3)配置文件增加 Eureka 相關配置
# Eureka相關配置
# Eureka 服務
server:port: 10010
spring:application:name: eureka-server
eureka: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/
(4)啟動類,開啟 Eureka 功能
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {public static void main(String[] args) {SpringApplication.run(EurekaServerApplication.class,args);}
}
四、服務注冊
服務注冊分為以下幾步:
1、加入 Eureka 的依賴
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>
2、修改配置信息
#Eureka Client
eureka:client:service-url:defaultZone: http://127.0.0.1:10010/eureka/
spring:application:name: product-service # 自定義名字
3、啟動,測試
五、服務發現
服務發現分為以下幾步:
1、加入 Eureka 依賴
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>
2、修改配置信息
配置信息與上面的一樣
3、修改遠程調用代碼
@Service
public 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:9090/product/"+orderInfo.getProductId();List<ServiceInstance> instances = discoveryClient.getInstances("product-service");String uri = instances.get(0).getUri().toString();String url = uri + "/product/"+orderInfo.getProductId();ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);orderInfo.setProductInfo(productInfo);return orderInfo;}
}
4、啟動,測試