大家好,我是老馬。
今天和大家來一起體驗一下 spring cloud,回首了一下以前的筆記,整理記錄 spring cloud 已經 2 年有餘,不過工作中不用,也就淡忘了。
最近在梳理學習微服務相關知識,就將 spring cloud 重溫一下。
Spring CloudSpring Cloud 為開發人員提供了工具,以快速構建分散式系統中的一些常見模式(例如,配置管理,服務發現,斷路器,智慧路由,微代理,控制匯流排,一次性令牌,全域性鎖,領導選舉,分散式 會話,群集狀態)。
核心元件Spring Cloud主要包含以下常用元件:Eureka/nacos、Ribbon、Feign
Eureka分成兩類:
(1)一是註冊中心及EurekaServer,用於提供服務註冊/服務申請等功能;
(2)一是被註冊者及服務提供者EurekaClient,用於向EurekaServer註冊服務並可從EurekaServer獲取需要呼叫的服務地址資訊;
需要向外提供服務的應用,需要使用EurekaClient來向Server註冊服務。
Ribbon負責進行客戶端負載均衡的元件;一般與RestTemplate結合,在訪問EurekaClient提供的服務時進行負載均衡處理。
也就是說,Ribbon用於服務呼叫者向被呼叫者進行服務呼叫,並且如果服務者有多個節點時,會進行客戶端的負載均衡處理;
Feign與Ribbon功能型別,用於呼叫方與被呼叫方的服務呼叫,同時進行客戶端負載均衡的處理;
不過它能提供類似本地呼叫的方式呼叫遠端的EurekaClient提供的服務;它實際上是在Ribbon基礎上進行了進一步的封裝來提高呼叫服務的簡便性。
使用場景假設現在有springcloud-eurekaClient和springcloud-eurekaClient2向外提供服務,該服務同時部署兩個節點;Client透過Feign或者是Ribbon呼叫其提供的服務,其部署關係及資料流向圖如下所示:
輸入圖片說明
第一步:啟動註冊中心(啟動springCloud-EurekaServer專案);服務提供者及呼叫者向服務中心註冊;
第二步:服務呼叫者向服務中心申請服務,根據服務中心返回的地址資訊呼叫服務提供者提供的服務;
第三步:註冊中心透過心跳檢測方式檢測服務提供者的狀態,當某個提供者連線不上時,傳送訊息通知所有註冊者;
如果你以前使用過類似 dubbo 的工具,會發現這些原理都是類似的。
dubbo
快速開始springcloud 的官方教程我看了幾分鐘還是感覺雲裡霧裡,於是網上查了一些入門案例,整理記錄如下,方便大家學習。
整體介紹此處使用 maven 多模組實現,當然也可以拆成多個獨立的應用。
共計三個模組:
springcloud-learn-eurekaserver可以理解為註冊中心。
springcloud-learn-eurekaclient服務的提供者模組
springcloud-learn-feignclient服務的使用者模組
基礎的 pom.xml這裡主要透過 import 引入 spring-cloud 的版本依賴,也演示了指定 springboot 依賴的方式。
maven-compiler-plugin 統一指定編譯的 jdk 版本為 1.8。
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.github.houbb</groupId> <artifactId>springcloud-learn</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <modules> <module>springcloud-learn-eurekaserver</module> <module>springcloud-learn-eurekaclient</module> <module>springcloud-learn-feignclient</module> </modules> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.4.RELEASE</version> <relativePath/> </parent> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR4</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build></project>
springcloud-learn-eurekaserver這個模組用於實現註冊中心。
pom.xml引入必須的依賴。
server: port: 8888#應用的名字spring: application: name: springcloud-eurekaservereureka: instance: hostname: localhost client: registerWithEureka: false # 由於該應用為註冊中心,所以設定為false,代表不向註冊中心註冊自己 fetchRegistry: false # 由於註冊中心的職責就是維護服務例項,他並不需要去檢索服務,所以也設定為false serviceUrl: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
啟動類透過 @EnableEurekaServer 註解啟動一個服務註冊中心提供給其他應用進行對話。
http://localhost:8888/
效果如下:
註冊中心
這裡類似於 dubbo-admin,我們可以對服務端和客戶端的情況,有一個最基本的管理。
springcloud-learn-eurekaclient這個模組是服務的提供者
pom.xml依賴配置如下:
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>springcloud-learn</artifactId> <groupId>com.github.houbb</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>springcloud-learn-eurekaclient</artifactId> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies></project>
application.yml我們這裡定義了應用的名稱,並且指定了註冊中心的地址。
server: port: 7777#應用的名字spring: application: name: springcloud-eurekaclienteureka: client: serviceUrl: defaultZone: http://localhost:8888/eureka/
核心實現CalcController.java
非常簡單的計算實現類,僅用於演示。
EurekaClient 啟用成功!2020-12-14 23:38:26.003 INFO 828 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_SPRINGCLOUD-EUREKACLIENT/192.xxx.xxx.xxx:springcloud-eurekaclient:7777 - registration status: 204
這裡發現服務已經進行了註冊,我們在註冊中心的控臺日志可以看到:
2020-12-14 23:38:26.003 INFO 3028 --- [nio-8888-exec-8] c.n.e.registry.AbstractInstanceRegistry : Registered instance SPRINGCLOUD-EUREKACLIENT/192.xxx.xxx.xxx:springcloud-eurekaclient:7777 with status UP (replication=false)
當然我們直接登入開始的控臺,也是可以看到這個服務的,說明註冊已經成功了。
springcloud-learn-feignclient服務呼叫的模組定義。
pom.xml依賴如下:
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>springcloud-learn</artifactId> <groupId>com.github.houbb</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>springcloud-learn-feignclient</artifactId> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies></project>
application.yml這裡主要指定了註冊中心的地址。
server: port: 9999#應用的名字spring: application: name: springcloud-feignclienteureka: client: serviceUrl: defaultZone: http://localhost:8888/eureka/
定義遠端呼叫介面
透過 @FeignClient 指定遠端客戶端的應用名稱,這裡我們指定的就是 springcloud-eurekaclient;其中 /add 是對應的加法方法名稱。
注意:這裡的 @RequestParam 是必須指定引數名稱的,不然會報錯。
http://localhost:9999/add
頁面直接返回
計算結果:3
為了便於大家學習,原始碼已全部開源:
https://gitee.com/houbinbin/springcloud-learn
小結springcloud 使用起來還是非常便捷的,這一切也正是 spring 的優秀之處,真正的做到了,write less & do more。
技術的本質都是類似的,個人感覺 springcloud 實際上和 dubbo 如果只看服務註冊發現之類的,差異不大,不過 spring cloud 全家桶還是比較豐盛的,後續有時間我們慢慢體驗。
rpc 呼叫大大方便了我們的日常開發,讓遠端服務變得像呼叫本地服務一樣簡單。
後續我們將和大家一起實現屬於自己的 RPC 框架,感興趣的小夥伴可以關注一波,實時獲得最新訊息。
我是老馬,期待與你的下次相遇。