Springcloud Alibaba



初極狹,才通人。復行數十步,豁然開朗。

引入

從文章的題目也可以看出, 我們本篇文章即將闡述的重心便是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)來使用

起步

以上採取任何一種方式都可以, 在這裏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是一樣的, 既可以拉去代碼進行定製化之後打包編譯, 也可以直接下載程序,起步即可.

我們在這裏採用方式二進行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那一套實現起來會更容易上手. 而且組件的封裝也比較全,

關於註冊中心配置中心以及熔斷器等等如果中小型公司不需要定製的話甚至可以做到開箱即用而且交互界面也比較友好, 只需要花心思編寫自己的服務提供者服務消費者即可

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章