Spring Cloud Alibaba微服務生態的基礎實踐
阿新 • • 發佈:2020-09-16
[toc]
## 一、背景
- 身為Java程式設計師,微服務是必須要掌握的一種架構。Spring Cloud作為提供微服務架構的完整技術生態鏈,給我們提供了非常多的框架與元件。其中的重要成員Spring Cloud Netflix也形成了一系列的技術棧:包括服務註冊與發現(Eureka),斷路器(Hystrix),智慧路由(Zuul)和客戶端負載平衡(Ribbon)等。
- 但不幸的是Spring Cloud Netflix的技術棧相繼宣佈進行維護階段:
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200916132736763.png#pic_left)
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200916133019597.png#pic_left)
## 二、初識Spring Cloud Alibaba
- 做為國內網際網路大廠的阿里巴巴,在開源領域的成就有目共睹。
1. 2016 年,阿里全面擁抱 Spring Boot;
2. 2017 年 12 月,Spring Cloud Alibaba 立項並順利進入 Spring Cloud 孵化器。
3. 2019 月 10 月 3 日,Spring Cloud Alibaba 正式 "掛牌" Spring 官方。
關於Spring Cloud Alibaba的孵化過程具體可參考:[《Spring Cloud Alibaba 從孵化到 "掛牌" 之旅》](https://developer.aliyun.com/article/721235)
> 同 Spring Cloud 一樣,Spring Cloud Alibaba 也是一套微服務解決方案,包含開發分散式應用微服務的必需元件,方便開發者通過 Spring Cloud 程式設計模型輕鬆使用這些元件來開發分散式應用服務。
> (圖片來源:阿里云云棲號)![圖片來源阿里云云棲號](https://img-blog.csdnimg.cn/20200916133950633.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2pwZ3podQ==,size_16,color_FFFFFF,t_70#pic_center)
- 做為微服務生態圈中冉冉升起的一顆新星,我們有理由去了解並掌握Spring Cloud Alibaba的各個技術棧。本文也將通過專案工程演練的方式對Spring Cloud Alibaba中的服務治理元件Nacos與高可用防護元件Sentinel進行基礎實踐。
## 三、Nacos的基礎實踐
- 在2018年 6 月份 Aliware 技術行上海站 Dubbo 開發者沙龍上,阿里巴巴高階技術專家郭平 (坤宇) 宣佈了阿里巴巴的一個新開源專案 Nacos。
> Nacos 支援幾乎所有主流型別的“服務”的發現、配置和管理:
> 1. Kubernetes Serviceg
> 2. RPC & Dubbo RPC Service
> 3. Spring Cloud RESTful Service
Nacos生態圖[(來自Nacos官網)](https://nacos.io/zh-cn/index.html)![來自Nacos官網](https://img-blog.csdnimg.cn/20200911125723219.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2pwZ3podQ==,size_16,color_FFFFFF,t_70#pic_center)
### 3.1 安裝Nacos並啟動服務
- 獲取Nacos安裝檔案並進行解壓
```bash
# 下載nacos最新版
wget https://github.com/alibaba/nacos/releases/download/1.3.2/nacos-server-1.3.2.tar.gz
# 解壓檔案
tar -xvf nacos-server-1.3.2.tar.gz
# 通過nacos-mysql.sql指令碼建立資料庫
cd nacos/conf
vim nacos-mysql.sql
```
- 建立Nacos配置資料庫
```sql
/******************************************/
/* 資料庫全名 = nacos_config */
/* 表名稱 = config_info */
/******************************************/
CREATE TABLE `config_info` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
`group_id` varchar(255) DEFAULT NULL,
`content` longtext NOT NULL COMMENT 'content',
`md5` varchar(32) DEFAULT NULL COMMENT 'md5',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '建立時間',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改時間',
`src_user` text COMMENT 'source user',
`src_ip` varchar(20) DEFAULT NULL COMMENT 'source ip',
`app_name` varchar(128) DEFAULT NULL,
`tenant_id` varchar(128) DEFAULT '' COMMENT '租戶欄位',
`c_desc` varchar(256) DEFAULT NULL,
`c_use` varchar(64) DEFAULT NULL,
`effect` varchar(64) DEFAULT NULL,
`type` varchar(64) DEFAULT NULL,
`c_schema` text,
PRIMARY KEY (`id`),
...
```
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200911152640615.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2pwZ3podQ==,size_16,color_FFFFFF,t_70#pic_left)
- 修改配置檔案
```bash
cd nacos/conf
# 編輯配置檔案
vim application.properties
#*************** Spring Boot Related Configurations ***************#
### Default web context path:
server.servlet.contextPath=/nacos
### Default web server port:
server.port=8848
#*************** Network Related Configurations ***************#
### If prefer hostname over ip for Nacos server addresses in cluster.conf:
# nacos.inetutils.prefer-hostname-over-ip=false
### Specify local server's IP:
# nacos.inetutils.ip-address=
#*************** Config Module Related Configurations ***************#
### If use MySQL as datasource:
spring.datasource.platform=mysql
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user=root
db.password=root
```
- 執行nacos
```bash
cd nacos/bin
# 單機執行
sh startup.sh -m standalone
```
- 登入nacos控制檯
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200911153525967.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2pwZ3podQ==,size_16,color_FFFFFF,t_70#pic_center)
### 3.2 建立微服務並向Nacos註冊服務
- 建立微服務工程專案
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200916140116704.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2pwZ3podQ==,size_16,color_FFFFFF,t_70#pic_center)
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200916140209176.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2pwZ3podQ==,size_16,color_FFFFFF,t_70#pic_center)
- 勾選Nacos Service Discovery依賴
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200916140247239.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2pwZ3podQ==,size_16,color_FFFFFF,t_70#pic_center)
- 開啟pom.xml,下載依賴
```xml
```
- 設定專案配置檔案:application.yml
```yml
# 埠
server:
port: 8083
spring:
application:
name: goods-service
cloud:
# nacos服務註冊
nacos:
discovery:
server-addr: 172.16.109.118:8848
```
- 通過 Spring Cloud Alibaba原生註解 @EnableDiscoveryClient 開啟服務註冊發現功能
```java
// 通過 Spring Cloud 原生註解 @EnableDiscoveryClient 開啟服務註冊發現功能
@EnableDiscoveryClient
@SpringBootApplication
public class DemoServiceApplication {
public static void main(String[] args) {
SpringApplication.run(DemoServiceApplication.class, args);
}
}
```
- 建立HTTP介面的商品資訊微服務,模擬返回商品列表
```java
/**
* 商品資訊微服務-模擬返回商品列表
*/
@RestController
@RequestMapping("api/goods")
public class GoodsService {
public static final Logger logger = LoggerFactory.getLogger(GoodsService.class);
// 返回商品列表
@GetMapping
pub