1. 程式人生 > >Spring Cloud Alibaba微服務生態的基礎實踐

Spring Cloud Alibaba微服務生態的基礎實踐

[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