首頁>技術>

大家好,我是老馬。

今天和大家來一起體驗一下 spring cloud,回首了一下以前的筆記,整理記錄 spring cloud 已經 2 年有餘,不過工作中不用,也就淡忘了。

最近在梳理學習微服務相關知識,就將 spring cloud 重溫一下。

Spring Cloud

Spring 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 框架,感興趣的小夥伴可以關注一波,實時獲得最新訊息。

我是老馬,期待與你的下次相遇。

25
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 什麼是CLS以及如何最佳化它