SpringCloud-Nacos/OpenFien/Gateway的基本介紹及快速上手
阿新 • • 發佈:2020-04-03
# Spring-Cloud-Alibaba-Nacos 註冊中心
## 下載、安裝 Nacos
下載地址:[https://github.com/alibaba/nacos/releases](https://github.com/alibaba/nacos/releases)
下載後解壓,開啟 bin 目錄,雙擊 startup.cmd 即可執行,出現錯誤可參考:[https://www.cnblogs.com/songjilong/p/12620021.html](https://www.cnblogs.com/songjilong/p/12620021.html)
## 引入 spring-cloud-alibaba、alibaba-nacos-discovery
```xml
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
com.alibaba.cloud
spring-cloud-alibaba-dependencies
2.1.0.RELEASE
pom
import
```
## 配置服務名、註冊中心地址
```yaml
spring:
application:
name: gulimall-coupon # 服務名稱
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 # nacos地址
```
4、執行需要註冊的服務、開啟瀏覽器輸入[http://127.0.0.1:8848/nacos](http://127.0.0.1:8848/nacos) ,使用者名稱密碼預設是 nacos,進入後點擊服務列表就可以看到所有註冊的服務了
# Spring-Cloud-OpenFeign 遠端呼叫
## 引入 openfeign 依賴
```xml
org.springframework.cloud
spring-cloud-starter-openfeign
```
## 編寫遠端呼叫介面
告訴 SpringCloud 這個介面需要呼叫的遠端服務,**介面方法的請求地址、名稱、返回值要與被呼叫的方法一致**
```java
//指定呼叫的遠端服務名
@FeignClient("gulimall-coupon")
public interface CouponFeignService {
@RequestMapping("/coupon/coupon/member/list")
public R memberCoupons();
}
```
## 開啟遠端呼叫服務
```java
@SpringBootApplication
@EnableDiscoveryClient
//指定自己建立的遠端介面的位置
@EnableFeignClients(basePackages = "com.sjl.gulimall.member.feign")
public class GulimallMemberApplication {
public static void main(String[] args) {
SpringApplication.run(GulimallMemberApplication.class, args);
}
}
```
# Spring-Cloud-Alibaba-Nacos 配置中心
## 引入alibaba-nacos-config
```xml
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
```
## 新增配置檔案`bootstrap.properties`
```properties
# 服務名
spring.application.name=gulimall-coupon
# nacos地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
```
## 開啟動態重新整理
完成上述兩步後,應用會從 Nacos Config 中獲取相應的配置,並新增在 Spring Environment 的 PropertySources 中。要想開啟動態重新整理,還需要在當前類加上 `@RefreshScope` 註解
```java
@RefreshScope //開啟動態重新整理
@RestController
@RequestMapping("coupon/coupon")
public class CouponController {
@Value("${coupon.user.name}")
private String name; //coupon.user.name=張三
@Value("${coupon.user.age}")
private Integer age; //coupon.user.age=18
@RequestMapping("/test")
public R test(){
return R.ok().put("name", name).put("age", age);
}
}
```
## 在Nacos新建配置檔案
進入 Nacos 控制檯,新建一個配置檔案,命名為`服務名.properties`
![](https://gitee.com/songjilong/FigureBed/raw/master/img/20200402173242.png)
## 動態的修改配置檔案
當我們將配置檔案的值修改後,訪問的資料也會 更新,如果配置中心和當前應用都配置了相同的項,優先使用配置中心的配置
![](https://gitee.com/songjilong/FigureBed/raw/master/img/20200402173631.png)
# Nacos 配置中心的一些概念與細節
## 名稱空間
> 用於進行租戶粒度的配置隔離。不同的名稱空間下,可以存在相同的 Group 或 DataID 的配置。Namespace 的常用場景之一是不同環境的配置的區分隔離,例如開發測試環境和生產環境的資源(如配置、服務)隔離等。
Nacos 中預設有一個 public 保留空間,預設所有新增的配置都放在這個空間中
我們可以在 Nacos 視覺化介面建立自己的名稱空間
![](https://gitee.com/songjilong/FigureBed/raw/master/img/20200403173015.png)
新建一個配置檔案,併發布,命名規則為`服務名.properties`
![](https://gitee.com/songjilong/FigureBed/raw/master/img/20200403173845.png)
在 `bootstrap.properties` 檔案中指定名稱空間的唯一標識,重啟該服務,即可訪問
```properties
spring.cloud.nacos.config.namespace=5a8f07f8-9fc0-480e-9d31-1a1800b7530b
```
## 配置集
> **一組相關或者不相關的配置項的集合稱為配置集**。在系統中,一個配置檔案通常就是一個配
> 置集,包含了系統各個方面的配置。例如,一個配置集可能包含了資料來源、執行緒池、日誌級
> 別等配置項。
## 配置集ID
> **Nacos中的某個配置集的 ID。 配置集ID是組織劃分配置的維度之一**。DataID 通常用於組織劃分系統的配置集。一個系統或者應用可以包含多個配置集,每個配置集都可以被一個有意義的名稱標識。DataID 通常採用類Java 包(如com.taobao.tc.refund.log.level) 的命名規則保證全域性唯一性。 此命名規則非強制。
**類似配置檔名**
![](https://gitee.com/songjilong/FigureBed/raw/master/img/20200403175146.png)
## 配置分組
> **Nacos 中的一組配置集,是組織配置的維度之一。**通過一個有意義的字串(如 Buy 或 Trade )對配置集進行分組,從而區分DataID 相同的配置集。當您在 Nacos 上建立一個配置時,如果未填寫配置分組的名稱,則配置分組的名稱預設採用DEFAULT_ GROUP。
在 Nacos 中新建一個分組後,需要在 `bootstrap.properties` 中指定自己要使用的分組
```properties
spring.cloud.nacos.config.group=dev
```
**通常將每個微服務建立自己的名稱空間,使用dev、prod、test等名稱作為配置分組,區分環境**
## 同時載入多個配置集
有了 Nacos 配置中心,我們就可以將所有的配置檔案都放在配置中心裡管理,專案裡只保留一個`bootstrap.properties`,非常便於管理
比如,現在將我們原本的配置檔案 `application.yml` 拆分為幾個部分放到配置中心
- 資料來源配置:datasource.yml
```yml
spring:
datasource:
url: jdbc:mysql://192.168.56.10:3306/gulimall_sms
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: root
```
- mybatis 配置:mybatis.yml
```yml
mybatis-plus:
mapper-locations: classpath:/mapper/**/*.xml
global-config:
db-config:
id-type: auto
```
- 其他配置:other.yml
```yml
server:
port: 7000
spring:
application:
name: gulimall-coupon
datasource:
url: jdbc:mysql://192.168.56.10:3306/gulimall_sms
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: root
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
```
我們還需要在 `bootstrap.properties` 中配置如下資訊
- data-id:配置檔名
- group:分組名
- refresh:自動重新整理(預設是false),即 修改了配置中心的值後是否重新整理
```properties
spring.cloud.nacos.config.ext-config[0].data-id=datasource.yml
spring.cloud.nacos.config.ext-config[0].group=dev
spring.cloud.nacos.config.ext-config[0].refresh=true
spring.cloud.nacos.config.ext-config[1].data-id=mybatis.yml
spring.cloud.nacos.config.ext-config[1].group=dev
spring.cloud.nacos.config.ext-config[1].refresh=true
spring.cloud.nacos.config.ext-config[2].data-id=other.yml
spring.cloud.nacos.config.ext-config[2].group=dev
spring.cloud.nacos.config.ext-config[2].refresh=true
```
點進原始碼可發現此配置是個 List 集合,因此可以配置多個
![](https://gitee.com/songjilong/FigureBed/raw/master/img/20200403184555.png)
配置完成後,可以訪問相關介面測試一下
----
更多配置請參考 **Nacos 官方文件**:[https://nacos.io/zh-cn/docs/what-is-nacos.html](https://nacos.io/zh-cn/docs/what-is-nacos.html)
# Spring-Cloud-Gatway API閘道器
## 簡介
閘道器作為**流量的入口**,常用功能包括路由轉發、許可權校驗、限流控制等。而 springcloud gateway 作為 SpringCloud 官方推出的第二代閘道器框架,取代了 Zuul 閘道器。
![幾種閘道器的效能對比](https://gitee.com/songjilong/FigureBed/raw/master/img/20200403185637.png)
## 使用
開啟服務註冊發現、配置 Nacos 註冊中心、配置中心地址、埠
```yml
server:
port: 88
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
```
```properties
spring.application.name=gulimall-coupon
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.namespace=24b9f0bf-ac39-431e-80f0-4daa0b923b7a
```
配置路由,使我們輸入`localhost:88?query=baidu`可以跳轉到百度官網,輸入`localhost:88?query=qq`可以跳轉到qq官網
```yml
spring:
cloud:
gateway:
routes:
- id: test_baidu
uri: https://www.baidu.com
predicates:
- Query=query,baidu
- id: test_qq
uri: https://www.qq.com
predicates:
- Query=query,qq
```
![](https://gitee.com/songjilong/FigureBed/raw/master/img/20200403203141.png)
----
**官方文件:**https://cloud.spring.io/spring-cloud-gateway/2.1.x/single/spring-cloud-gate