初極狹,才通人。復行數十步,豁然開朗。
引入
從文章的題目也可以看出, 我們本篇文章即將闡述的重心便是Springcloud Alibaba
, 會依次涉及各組件的知識.
如果您以前對SpringCloud
特別熟悉, 那便再好不過了. 如果確實之前不太瞭解, 大家可以先移步SpringCloud系列知識, 在該系列中我們詳細介紹了基於Netflix
的SpringCloud知識.
簡介
在我們熟悉的微服務系統中, 會包含如下幾個必要的組件
- Netflix Eureka 註冊中心, 服務發現
- Spring Cloud Config 分佈式配置中心
- Netflix Zuul 服務網關
- Netflix Hystrix + Dashboard + Turbine 斷路器與鏈路跟蹤
- Netflix Ribbon 客戶端負載均衡
- Netflix Fegin 基於Ribbon的接口式客戶端
其中註冊中心和配置中心以及客戶端和服務端是一個微服務系統中比較重要的, 剩下的熔斷器或者鏈路跟蹤其實對於中型企業來說, 不是那麼重要, 因爲自身的業務導致整個系統的鏈路複雜度或者調用的頻率都不是很高. 所以可有可無.
上面我們介紹了微服務中一些核心的組成部分, 我們現在進入正題看下SpringCloud Alibaba
的解決方案
- Nacos = Eureka/Consule + Config + Admin 註冊中心, 配置中心
- Sentinel = Hystrix + Dashboard + Turbine 斷路器鏈路跟蹤
- Dubbo = Ribbon + Feign 客戶端調用方案
以上便是SpringCloud Alibaba
的解決方案, 可以看到, 從組件的數量上來說少了一些, 它把一些功能進行了一下分類合併. 從數量來說是少了, 從對開發人員的友好程度上來說也稍微友好了一些, 我們下面分別闡述一下
Nacos
Nacos致力於幫助您發現、配置和管理微服務。Nacos提供了一組簡單易用的特性集,幫助您快速實現動態服務發現、服務配置、服務元數據及流量管理。Nacos幫助您更敏捷和容易地構建、交付和管理微服務平臺。Nacos是構建以“服務”爲中心的現代應用架構 (例如微服務範式、雲原生範式) 的服務基礎設施。
使用Nacos作爲微服務架構中的註冊中心(替代:eurekba、consul等傳統方案)以及配置中心(spring cloud config)來使用
。
起步
-
方式一: 直接下載程序, 對配置文件進行修改即可, 好比部署一個
Redis
或者Mysql
-
方式二: 從GitHub下載源碼, 可以根據自己的需求修改源碼, 然後重新打包即可
以上採取任何一種方式都可以, 在這裏Demo通用的方式一, 下載之後直接解壓. 運行start
腳本啓動, 然後通過瀏覽器訪問: http://127.0.0.1:8848/nacos/
默認端口是 8848, 這些配置都可以通過配置文件自定義. 瀏覽器打開之後便是如下界面
通過左側列表, 我們看到了他所包含的幾個選項, 首先我們來看一下配置中心
當我們的任何一個服務註冊到Nacos
便可以直接修改配置.
配置中心
首先我們創建一個springboot(我的版本爲2.2.5.RELEASE
)項目, 引入以下核心依賴
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
然後我們在配置文件目錄下新建一個bootstrap.properties裏面配置Nacos地址以及應用名稱
緊接着我們新建一個ConfigController來進行動態測試
package com.example.demo.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/config")
@RefreshScope
public class ConfigController {
@Value("${useLocalCache:false}")
private boolean useLocalCache;
@Value("${hello}")
private String hello;
@RequestMapping("/get")
public boolean get() {
return useLocalCache;
}
@RequestMapping("/hello")
public String hello() {
return hello;
}
}
調用Nacos Open API將配置發佈到Nacos服務器。假設dataId爲example.properties,內容爲useLocalCache=true
curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=example.properties&group=DEFAULT_GROUP&content=useLocalCache=true"
然後我們從Nacos控制檯觀察一下配置
然後我們在瀏覽器請求一下寫好的測試接口http://localhost:8005/config/hello
會返回123
. 當我們在nacos中修改了hello
的值爲change-later
之後我們再請求一下, 立馬發生了改變.
這個便是他配置中心的功能, 從操作的便利以及友好程度上來說比較好, 而且支持多種類型的配置文件.
註冊中心
服務提供者
首先, 我們還是再新建一個工程, 作爲服務提供者, 註冊到註冊中心, 引入以下核心依賴
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
修改application.properties配置文件分別對應服務端口號, 以及nacos地址
啓動類
package com.felix.cloudprovider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
然後我們再建立一個Controller供測試
package com.felix.cloudprovider.controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class Controller {
@RequestMapping(value = "/echo/{param}", method = RequestMethod.GET)
public String echo(@PathVariable String param) {
return "Hello " + param;
}
}
客戶端
首先還是引入依賴, 因爲我們打算用Fegin調用(所以我多引入了openfeign), 當然也可以用Dubbo來實現調用
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
還是修改配置文件
然後我們就和傳統的方式調用一樣, 寫一個FeignClient
來實現調用即可
依舊寫一個Controller方便瀏覽器測試
package com.felix.cloudconsumer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class Controller {
@Autowired
private FeignInteface feignClient;
@RequestMapping(value = "/consumer/{param}", method = RequestMethod.GET)
public String echo(@PathVariable String param) {
return feignClient.echo(param);
}
}
啓動之後訪問查看返回結果
與此同時我們在回過頭來看看Nacos那邊的樣子
可以看到我們的服務端和客戶端都註冊上來了, 並且還可以通過界面進行一些簡單的配置
那麼關於nacos剩下的就是一個命名空間
和集羣的管理
也好實現, 在這裏我沒進行Demo.
Sentinel
說完了Nacos
我們緊接着看一下另一個組件Sentinel
Sentinel 以流量爲切入點,從流量控制、熔斷降級、系統負載保護等多個維度保護服務的穩定性。
官方說的特性有如下:
豐富的應用場景
:Sentinel 承接了阿里巴巴近 10 年的雙十一大促流量的核心場景,例如秒殺(即突發流量控制在系統容量可以承受的範圍)、消息削峯填谷、集羣流量控制、實時熔斷下游不可用應用等。完備的實時監控
:Sentinel 同時提供實時的監控功能。您可以在控制檯中看到接入應用的單臺機器秒級數據,甚至 500 臺以下規模的集羣的彙總運行情況。廣泛的開源生態
:Sentinel 提供開箱即用的與其它開源框架/庫的整合模塊,例如與 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相應的依賴並進行簡單的配置即可快速地接入 Sentinel。完善的 SPI 擴展點
:Sentinel 提供簡單易用、完善的 SPI 擴展接口。您可以通過實現擴展接口來快速地定製邏輯。例如定製規則管理、適配動態數據源等。
起步
關於Sentinel
的使用方式和Nacos是一樣的, 既可以拉去代碼進行定製化之後打包編譯, 也可以直接下載程序,起步即可.
- 方式一: 源碼地址https://github.com/alibaba/Sentinel
- 方式二: 下載直接啓動: https://github.com/alibaba/Sentinel/releases
我們在這裏採用方式二進行Demo, 下載完成之後還是啓動(截圖是我調用完之後的截圖)
可以看到這個界面比Netflix要友好的很多, 包含了鏈路調用監控, 以及限流規則, 以及熔斷等等配置, 可以說是很全面了.
客戶端和服務端連接Sentinel實現監控
我們在上面的兩個工程中, 分別添加如下依賴
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
服務端application.properties配置文件中添加sentinel地址
spring.cloud.sentinel.transport.dashboard=127.0.0.1:8080
客戶端application.properties配置文件中添加sentinel地址因爲我們使用了Fegin所以需要再開啓fegin的支持
spring.cloud.sentinel.transport.dashboard=127.0.0.1:8080
feign.sentinel.enabled=true
然後再我們的上一步的FeignClient中簡單改造一下寫一個fallback
測試一下降級處理
package com.felix.cloudconsumer;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@FeignClient(value = "service-provider",fallback = EchoServiceFallback.class, configuration = FeignConfiguration.class)
public interface FeignInteface {
@RequestMapping(value = "/echo/{param}", method = RequestMethod.GET)
String echo(@PathVariable("param") String param);
}
class FeignConfiguration {
@Bean
public EchoServiceFallback echoServiceFallback() {
return new EchoServiceFallback();
}
}
class EchoServiceFallback implements FeignInteface {
@Override
public String echo(@PathVariable("param") String param) {
return "echo fallback";
}
}
分別配置完成之後, 啓動服務端和客戶端, 並且不斷請求測試便可以從Sentinel
中看到下面的調用軌跡了
然後我們通過頁面流控規則
配置了一個限流來測試一下
配置好之後, 我們不停的請求來進行測試, 可以看到當我們請求太頻繁的時候, 我們寫的fallback生效了
那麼到這裏, 我們關於Sentinel
的介紹也到這了
剩下關於服務調用Dubbo
其實出來的時間比較早, 而且那個東西, 我一直覺得彆扭, 所以我在本篇文章中, 還是使用Feign
來實現的.當然大家也可以自己嘗試一下使用Dubbo
, 實現的時候其實也算便捷
總結
在本文中, 我們使用SpringCloud Alibaba
的解決方案來簡單搭建了一個微服務的Demo進行比較, 總的來說, 使用起來還是比較容易的. 我覺得比Netflix
那一套實現起來會更容易上手. 而且組件的封裝也比較全,
關於註冊中心配置中心以及熔斷器等等
如果中小型公司不需要定製的話甚至可以做到開箱即用而且交互界面也比較友好, 只需要花心思編寫自己的服務提供者
和服務消費者
即可