當初我學習時候就是參考這位大佬的部落格: Nacos整合Spring Cloud Gateway 基礎使用
現在學習到spring cloud alibaba 使用nacos做服務中心,dubbo做通訊,大體流程就是:
-
先將制定好的介面打包上傳到雲。提供者和消費者都依賴這個介面包
-
而後新建提供者模組來實現介面,再將服務註冊到nacos上面
-
新建消費者模組來使用介面,消費者去nacos上面尋找提供者根據服務名
-
消費者到nacos和nacos到提供者都是使用dubbo通訊實現。
本篇部落格只介紹閘道器到消費者。首先先建立消費者如下:
1. 新建maven模組nacos-consumer1新增pom依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--nacos註冊發現依賴-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--如果使用本地nacos,此依賴可以省略,因為雲端nacos啟動時候會檢測雲端配置-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2. 在resources下新建檔案bootstrap.yml檔案
注:nacos是區分yaml和yml格式的,雖然本地載入時候不區分,但是使用雲端配置時候就得嚴格要求yml檔案型別,而且本地yaml檔案是沒有程式碼提醒的。至於application.yml、application.properties和bootstrap.yml的區別可以百度瞭解。
server:
port: 8011 #consumer2的埠是8012
spring:
application:
name: nacos-consumer
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
namespace: 5467517c-4121-4275-b459-b92a7a12f508
#nacos上面新建名稱空間的id
config: #本地一般不需要配置中心,如果使用雲nacos會報找不到配置的錯誤
#這時候需要配置上,或者config.enable: false關閉即可
server-addr: 127.0.0.1:8848
namespace: 5467517c-4121-4275-b459-b92a7a12f508
consumer2配置只是埠不一樣,服務名nacos-consumer是一樣的,為了測試負載均衡。
3. 建立controller類com.example.controller.HelloController.java
@RestController
@RequestMapping("/testhello")
public class HelloController {
@GetMapping("/hello")
public String HelloController(){
// consumer2則修改返回值為consumer2
return "This is nacos-consumer1";
}
}
4. 建立啟動類com.example.NacosConsumerOneApplication
@SpringBootApplication
public class NacosConsumerOneApplication {
// consumer建立Two,有區分即可
public static void main(String[] args) {
SpringApplication.run(NacosConsumerOneApplication.class, args);
}
}
5. 接下來建立閘道器模組nocas-gateway,引入pom依賴
<!--gateway依賴-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<version>2.2.8.RELEASE</version>
</dependency>
<!--nacos註冊發現依賴-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--如果使用本地nacos,此依賴可以省略,因為雲端nacos啟動時候會檢測雲端配置-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
6. 然後在resources下面建立bootstrap.yml檔案
server:
port: 8001
spring:
application:
name: nacos-consumer
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
namespace: 5467517c-4121-4275-b459-b92a7a12f508
#nacos上面新建名稱空間的id
config: #本地一般不需要配置中心,如果使用雲nacos會報找不到配置的錯誤
#這時候需要配置上,或者config.enable: false關閉即可
server-addr: 127.0.0.1:8848
namespace: 5467517c-4121-4275-b459-b92a7a12f508
gateway:
discovery:
locator:
enabled: true #預設false,開啟後可以通過ip:port/服務名稱/介面地址進行服務轉發
# 即: localhost:8001/nacos-consumer/testhello/hello
lower-case-service-id: true #把服務名轉換為小寫,Eureka 中預設都是大寫
#但是nacos不會自動全部轉換為大寫,除非手動寫成大寫,也可以不寫。
routes: #路由轉發:最重要的地方
- id: nacos-gateway-provider #路由的ID,沒有固定規則但要求唯一,建議配合服務名
uri: lb://nacos-consumer #匹配後提供服務的路由地址,lb代表負載均衡
predicates:
- Path=/testhello/hello #斷言,路徑相匹配的進行路由轉發
比起消費者來說,閘道器這裡就多了gateway部分,那麼將其中可以省略的地方省去就是新增:
server:
port: 8001
spring:
application:
name: nacos-consumer
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
namespace: 5467517c-4121-4275-b459-b92a7a12f508
# nacos上面新建名稱空間的id
config: # 本地一般不需要配置中心,如果使用雲nacos會報找不到配置的錯誤,
#這時候需要配置上,或者config.enable: false關閉即可
server-addr: 127.0.0.1:8848
namespace: 5467517c-4121-4275-b459-b92a7a12f508
gateway:
routes: #路由轉發:最重要的地方
- id: nacos-gateway-provider #路由的ID,沒有固定規則但要求唯一,建議配合服務名
uri: lb://nacos-consumer #匹配後提供服務的路由地址,lb代表負載均衡
predicates:
- Path=/testhello/hello #斷言,路徑相匹配的進行路由
7. 接下來建立com.example.NacosGatewayApplication.java
@SpringBootApplication
public class NacosGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(NacosGatewayApplication.class, args);
}
}
8. 啟動兩個消費者,一個閘道器測試埠
-
本地nacos登入 http://127.0.0.1:8848/nacos/index.html ,賬號密碼都是nacos就可以看到配置和服務.
-
可以通過 http://localhost:8011 和 8012/testhello/hello 測試消費者,就是兩個普通的controller
-
閘道器啟動後通過閘道器 localhost:8001.testhello/hello 能轉發到上面其中一個
-
測試 http://localhost:8001/testhello/hello 並且不斷重新整理顯示內容會在兩個消費者之間相互切換。這就是
負載均衡
,當然是預設的負載均衡演算法,我們也可以自定義。
9. 在標題6中若開啟了gateway.discovery.locator.enabled=true
那麼閘道器可以將 http://localhost:8001/nacos-consumer/testhello/hello 識別轉發,若關閉則404.
這就是gateway+nacos最基礎的配置方法,之後會大概寫謂詞predicates中的內容和過濾器filter的筆記。
學無止境,程式碼與生活,誰也不能虧待了。 2021-05-12 22:48:40 星期三