寫在前面
閘道器的作用不在此贅述,舉個最常用的例子,我們搭建了微服務,前端呼叫各服務介面時,由於各服務介面不一樣,如果讓前端同事分別呼叫,前端同事會瘋的。而閘道器就可以解決這個問題,閘道器遮蔽了各業務服務的埠,對前端同事來說,他們只負責呼叫閘道器服務埠下的服務就可以了。本文簡單描述如何使用Spring Cloud全家桶中的閘道器服務,再配以Nacos。關於Nacos簡單應用,可以看我其他部落格。
服務提供者
從https://start.spring.io/下載一個原始的spring boot工程,如何下載就不在這裡說了。新增依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
分別新增了web依賴、配置中心依賴和註冊中心依賴。
配置檔案如下:
server.port=8070
spring.application.name=service-provider
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
啟動類如下:
package com.chris.springboot; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication @EnableDiscoveryClient public class MySpringbootApplication { public static void main(String[] args) { SpringApplication.run(MySpringbootApplication.class, args); } }
介面類如下:
package com.chris.springboot.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/provider") @RefreshScope public class ConfigController { @Value(value = "${Hello:123}") private String hello; @GetMapping("/helloProvider") public String helloProvider(){ return hello; } }
此服務為我的部落格:https://www.cnblogs.com/ncwuwsh/p/12732516.html中的服務,可參看。
閘道器服務
從https://start.spring.io/下載一個原始的spring boot工程,如何下載就不在這裡說了。新增依賴:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2.2.1.RELEASE</version> </dependency>
注意,千萬不要新增web依賴。
配置檔案可以使用properties,也可以使用yml格式。yml格式如下:
server:
port: 8080
spring:
application:
name: api-gateway
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
gateway:
discovery:
locator:
enabled: true #表明gateway開啟服務註冊和發現的功能,並且spring cloud gateway自動根據服務發現為每一個服務建立了一個router,這個router將以服務名開頭的請求路徑轉發到對應的服務。
lower-case-service-id: true #是將請求路徑上的服務名配置為小寫(因為服務註冊的時候,向註冊中心註冊時將服務名轉成大寫的了),比如以/service-hi/*的請求路徑被路由轉發到服務名為service-hi的服務上。
routes:
- id: gateway-service
uri: lb://service-provider #此配置的值註冊到Nacos中服務提供者的spring.application.name的值
predicates:
- Path=/provider/**
使用yml的同學,一定要去查下yml的一些規則,比如 :後面,值的前面,一定要有空格,縮排不要使用tab鍵,而要用兩個空格縮排等
下面是properties格式配置檔案:
server.port=8080
spring.application.name=api-gateway
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
#表明gateway開啟服務註冊和發現的功能,並且spring cloud gateway自動根據服務發現為每一個服務建立了一個router,這個router將以服務名開頭的請求路徑轉發到對應的服務。
spring.cloud.gateway.discovery.locator.enabled=true
#是將請求路徑上的服務名配置為小寫(因為服務註冊的時候,向註冊中心註冊時將服務名轉成大寫的了),比如以/service-hi/*的請求路徑被路由轉發到服務名為service-hi的服務上。
spring.cloud.gateway.discovery.locator.lower-case-service-id=true
spring.cloud.gateway.routes[0].id=gateway-service
spring.cloud.gateway.routes[0].uri=lb://service-provider
spring.cloud.gateway.routes[0].predicates[0]=Path=/provider/**
下面是閘道器的啟動類:
package com.chris.gatewayrouter; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.gateway.route.RouteLocator; import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder; import org.springframework.context.annotation.Bean; @SpringBootApplication @EnableDiscoveryClient public class GatewayrouterApplication { public static void main(String[] args) { SpringApplication.run(GatewayrouterApplication.class, args); } @Bean public RouteLocator myRoutes(RouteLocatorBuilder builder) { return builder.routes().build(); } }
然後啟動Nacos,服務提供者和閘道器服務,使用瀏覽器訪問:http://127.0.0.1:8080/provider/helloProvider
搞定。
閘道器服務的其他高階應用,自己去看官網咖。
官網是最好的老師