從品牌網(wǎng)站建設(shè)到網(wǎng)絡(luò)營(yíng)銷策劃,從策略到執(zhí)行的一站式服務(wù)
來源:公司資訊 | 2021.08.17
本文是《Spring Cloud Gateway實(shí)戰(zhàn)》系列的第二篇,經(jīng)過前文我們了解到Spring Cloud Gateway的中心是路由裝備,然后在本地application.yml中裝備了一條路由,但這種修改本地裝備文件的辦法缺少靈敏性,未必能滿意靈敏多變的事務(wù)需求,因此,本篇的意圖就是找出本地裝備之外的其他裝備辦法來,滿意各種實(shí)踐需求;
總的來說以下三種辦法都是常用的:
方針地址支撐用服務(wù)名(替代之前的IP+端口);
支撐在nacos上裝備;
支撐寫代碼的辦法裝備;
別的還有一種愈加靈敏的裝備辦法:動(dòng)態(tài)署理,由于涉及到不少的代碼所以會(huì)單獨(dú)出一篇文章詳細(xì)介紹
源碼下載
本篇實(shí)戰(zhàn)中的完整源碼可在GitHub下載到,地址和鏈接信息如下表所示(https://github.com/zq2599/blog_demos):
名稱 鏈接 備注
項(xiàng)目主頁 https://github.com/zq2599/blog_demos 該項(xiàng)目在GitHub上的主頁
git庫房地址(https) https://github.com/zq2599/blog_demos.git 該項(xiàng)目源碼的庫房地址,https協(xié)議
git庫房地址(ssh) git@github.com:zq2599/blog_demos.git 該項(xiàng)目源碼的庫房地址,ssh協(xié)議
這個(gè)git項(xiàng)目中有多個(gè)文件夾,本篇的源碼在spring-cloud-tutorials文件夾下,如下圖紅框所示:
準(zhǔn)備工作
正式開端前需要再做一點(diǎn)準(zhǔn)備工作,整個(gè)《Spring Cloud Gateway實(shí)戰(zhàn)》系列中,一切請(qǐng)求最后都會(huì)被路由到provider-hello這個(gè)web上去,該服務(wù)現(xiàn)在只有一個(gè)web接口/hello/str,現(xiàn)在我們?cè)俳o它添加一個(gè),后邊的實(shí)戰(zhàn)會(huì)用到
新添加的web接口來自LBTest.java,可見非常簡(jiǎn)略:
package com.bolingcavalry.provider.controller;
import com.bolingcavalry.common.Constants;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.text.SimpleDateFormat;
import java.util.Date;
@RestController
@RequestMapping("/lbtest")
public class LBTest {
private String dateStr(){
return new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date());
}
/**
* 回來字符串類型
* @return
*/
@GetMapping("/str")
public String helloStr() {
return Constants.LB_PREFIX + ", " + dateStr();
}
}
上述代碼中的Constants.LB_PREFIX來自子工程common:
package com.bolingcavalry.common;
public interface Constants {
String HELLO_PREFIX = "Hello World";
String LB_PREFIX = "Load balance";
}
寫完代碼后,先保證nacos現(xiàn)已發(fā)動(dòng)
在發(fā)動(dòng)provider-hello工程,發(fā)動(dòng)成功后去看nacos,承認(rèn)現(xiàn)已注冊(cè):
準(zhǔn)備結(jié)束,可以開端實(shí)戰(zhàn)了
方針地址支撐用服務(wù)名(替代之前的IP+端口)
我們從最簡(jiǎn)略的開端,先看前文的路由裝備,如下圖紅框,方針地址是IP+端口:
玩過Spring Cloud的您天然看出了問題所在:沒有注冊(cè)發(fā)現(xiàn),確實(shí),這樣將地址和端口寫死在裝備文件中是不合適的,我們先來處理這個(gè)問題;
新增名為gateway-by-loadbalance的子工程,其pom.xml中的依靠情況如下,可見重點(diǎn)是spring-cloud-starter-loadbalancer:
com.bolingcavalry
common
${project.version}
org.springframework.cloud
spring-cloud-starter-gateway
io.projectreactor
reactor-test
test
org.springframework.boot
spring-boot-starter-test
test
org.springframework.cloud
spring-cloud-starter-loadbalancer
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
發(fā)動(dòng)類的代碼省去了(和前文的一樣)
裝備信息如下,重點(diǎn)是uri的值lb://provider-hello,用了前綴lb:,后邊的provider-hello就是在nacos注冊(cè)的服務(wù)名:
server:
#服務(wù)端口
port: 8085
spring:
application:
name: gateway-by-loadbalance
cloud:
nacos:
# 注冊(cè)中心的裝備
discovery:
server-addr: 127.0.0.1:8848
gateway:
routes:
- id: path_route_lb
uri: lb://provider-hello
predicates:
- Path=/lbtest/**
單元測(cè)驗(yàn)類:
package com.bolingcavalry.gateway;
import com.bolingcavalry.common.Constants;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.reactive.AutoConfigureWebTestClient;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.web.reactive.server.WebTestClient;
import static org.junit.jupiter.api.Assertions.assertTrue;
@SpringBootTest
@ExtendWith(SpringExtension.class)
@AutoConfigureWebTestClient
public class HelloTest {
@Autowired
private WebTestClient webClient;
@Test
void testLoadBalance() {
webClient.get()
.uri("/lbtest/str")
.accept(MediaType.APPLICATION_JSON)
.exchange()
// 驗(yàn)證狀況
.expectStatus().isOk()
// 驗(yàn)證成果,留意成果是字符串格局
.expectBody(String.class).consumeWith(result -> assertTrue(result.getResponseBody().contains(Constants.LB_PREFIX)));
}
運(yùn)行單元測(cè)驗(yàn),經(jīng)過,可見上述裝備可以經(jīng)過前綴lb:精確找到服務(wù):
支撐在nacos上裝備
將一切裝備信息寫在application.yml中有個(gè)問題:不能長(zhǎng)途裝備,這在應(yīng)用數(shù)量較多的場(chǎng)景就不方便了,好在nacos供給了長(zhǎng)途裝備的才能,應(yīng)用發(fā)動(dòng)后可以從nacos獲得自己的裝備信息,我們來試試
新增名為gateway-nacos-config的子工程,其pom.xml中的依靠情況如下,請(qǐng)留意里邊的中文注釋,每指明了每一個(gè)依靠的作用:
com.bolingcavalry
common
${project.version}
org.springframework.cloud
spring-cloud-starter-gateway
io.projectreactor
reactor-test
test
org.springframework.boot
spring-boot-starter-test
test
org.springframework.cloud
spring-cloud-starter-bootstrap
org.springframework.cloud
spring-cloud-starter-loadbalancer
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
本地的裝備文件bootstrap.yml,非常簡(jiǎn)略,就是nacos的地址和長(zhǎng)途裝備信息:
spring:
application:
name: gateway-nacos-config
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
file-extension: yml
group: DEFAULT_GROUP
接下來再nacos添加一個(gè)裝備文件,操作如下圖紅框:
添加一個(gè)裝備,要留意的地方如下(裝備信息的文本稍后給出,便于仿制):
上圖中完整的裝備信息如下:
server:
port: 8083
spring:
cloud:
gateway:
routes:
- id: path_route_addr
uri: http://127.0.0.1:8082
predicates:
- Path=/hello/**
- id: path_route_lb
uri: lb://provider-hello
predicates:
- Path=/lbtest/**
測(cè)驗(yàn)類中的兩個(gè)測(cè)驗(yàn)辦法如下所示,和前面沒有任何區(qū)別:
@Test
void testHelloPredicates() {
webClient.get()
.uri("/hello/str")
.accept(MediaType.APPLICATION_JSON)
.exchange()
// 驗(yàn)證狀況
.expectStatus().isOk()
// 驗(yàn)證成果,留意成果是字符串格局
.expectBody(String.class).consumeWith(result -> assertTrue(result.getResponseBody().contains(Constants.HELLO_PREFIX)));
}
@Test
void testLoadBalance() {
webClient.get()
.uri("/lbtest/str")
.accept(MediaType.APPLICATION_JSON)
.exchange()
// 驗(yàn)證狀況
.expectStatus().isOk()
// 驗(yàn)證成果,留意成果是字符串格局
.expectBody(String.class).consumeWith(result -> assertTrue(result.getResponseBody().contains(Constants.LB_PREFIX)));
}
運(yùn)行單元測(cè)驗(yàn)類,測(cè)驗(yàn)經(jīng)過,證明從nacos獲取裝備文件成功:
寫代碼的辦法裝備
前面的幾個(gè)例子,路由信息都是寫在裝備文件中的,其實(shí)還有一種辦法:寫代碼裝備路由,能自己寫代碼來裝備,這靈敏性就更強(qiáng)了
新增名為gateway-by-code的子工程,其pom.xml文件參照前面工程的即可
接下來的本例的重點(diǎn),在裝備類中添加一個(gè)RouteLocator類型的bean,經(jīng)過以下代碼即可添加一個(gè)路由:
package com.bolingcavalry.gateway.cofig;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RouteConfig {
@Bean
public RouteLocator customizeRoute(RouteLocatorBuilder builder) {
return builder
.routes()
.route(
// 第一個(gè)參數(shù)是路由的唯一身份
"path_route_lb",
// 第二個(gè)參數(shù)是個(gè)lambda實(shí)現(xiàn),
// 設(shè)置了配套條件是依照請(qǐng)求路徑匹配,以及轉(zhuǎn)發(fā)地址,
// 留意lb://表示這是個(gè)服務(wù)名,要從
r -> r.path("/lbtest/**").uri("lb://provider-hello")
)
.build();
}
}
上述代碼只裝備了一個(gè)路由,還有一個(gè)在裝備文件中,這樣就能驗(yàn)證代碼和裝備文件能不能同時(shí)收效了:
server:
#服務(wù)端口
port: 8084
spring:
application:
name: gateway-by-code
cloud:
nacos:
discovery:
# nacos服務(wù)地址
server-addr: 127.0.0.1:8848
gateway:
routes:
- id: path_route_addr
uri: http://127.0.0.1:8082
predicates:
- Path=/hello/**
測(cè)驗(yàn)類和之前工程的一模一樣,就不占用篇幅了,依舊是兩個(gè)測(cè)驗(yàn)辦法testHelloPredicates和testLoadBalance
履行單元測(cè)驗(yàn)可以順利經(jīng)過,證明代碼裝備路由沒有問題:
至此,負(fù)載均衡、nacos裝備、代碼裝備的實(shí)例我們都測(cè)驗(yàn)過了,它們合起來會(huì)給實(shí)踐生存環(huán)境的裝備帶來很大的方便,期望可以給您一些參閱
————————————————
版權(quán)聲明:本文為CSDN博主「程序員欣宸」的原創(chuàng)文章,遵從CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/boling_cavalry/article/details/119592175本篇概覽
本文是《Spring Cloud Gateway實(shí)戰(zhàn)》系列的第二篇,經(jīng)過前文我們了解到Spring Cloud Gateway的中心是路由裝備,然后在本地application.yml中裝備了一條路由,但這種修改本地裝備文件的辦法缺少靈敏性,未必能滿意靈敏多變的事務(wù)需求,因此,本篇的意圖就是找出本地裝備之外的其他裝備辦法來,滿意各種實(shí)踐需求;
總的來說以下三種辦法都是常用的:
方針地址支撐用服務(wù)名(替代之前的IP+端口);
支撐在nacos上裝備;
支撐寫代碼的辦法裝備;
別的還有一種愈加靈敏的裝備辦法:動(dòng)態(tài)署理,由于涉及到不少的代碼所以會(huì)單獨(dú)出一篇文章詳細(xì)介紹
源碼下載
本篇實(shí)戰(zhàn)中的完整源碼可在GitHub下載到,地址和鏈接信息如下表所示(https://github.com/zq2599/blog_demos):
名稱 鏈接 備注
項(xiàng)目主頁 https://github.com/zq2599/blog_demos 該項(xiàng)目在GitHub上的主頁
git庫房地址(https) https://github.com/zq2599/blog_demos.git 該項(xiàng)目源碼的庫房地址,https協(xié)議
git庫房地址(ssh) git@github.com:zq2599/blog_demos.git 該項(xiàng)目源碼的庫房地址,ssh協(xié)議
這個(gè)git項(xiàng)目中有多個(gè)文件夾,本篇的源碼在spring-cloud-tutorials文件夾下,如下圖紅框所示:
準(zhǔn)備工作
正式開端前需要再做一點(diǎn)準(zhǔn)備工作,整個(gè)《Spring Cloud Gateway實(shí)戰(zhàn)》系列中,一切請(qǐng)求最后都會(huì)被路由到provider-hello這個(gè)web上去,該服務(wù)現(xiàn)在只有一個(gè)web接口/hello/str,現(xiàn)在我們?cè)俳o它添加一個(gè),后邊的實(shí)戰(zhàn)會(huì)用到
新添加的web接口來自LBTest.java,可見非常簡(jiǎn)略:
package com.bolingcavalry.provider.controller;
import com.bolingcavalry.common.Constants;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.text.SimpleDateFormat;
import java.util.Date;
@RestController
@RequestMapping("/lbtest")
public class LBTest {
private String dateStr(){
return new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date());
}
/**
* 回來字符串類型
* @return
*/
@GetMapping("/str")
public String helloStr() {
return Constants.LB_PREFIX + ", " + dateStr();
}
}
上述代碼中的Constants.LB_PREFIX來自子工程common:
package com.bolingcavalry.common;
public interface Constants {
String HELLO_PREFIX = "Hello World";
String LB_PREFIX = "Load balance";
}
寫完代碼后,先保證nacos現(xiàn)已發(fā)動(dòng)
在發(fā)動(dòng)provider-hello工程,發(fā)動(dòng)成功后去看nacos,承認(rèn)現(xiàn)已注冊(cè):
準(zhǔn)備結(jié)束,可以開端實(shí)戰(zhàn)了
方針地址支撐用服務(wù)名(替代之前的IP+端口)
我們從最簡(jiǎn)略的開端,先看前文的路由裝備,如下圖紅框,方針地址是IP+端口:
玩過Spring Cloud的您天然看出了問題所在:沒有注冊(cè)發(fā)現(xiàn),確實(shí),這樣將地址和端口寫死在裝備文件中是不合適的,我們先來處理這個(gè)問題;
新增名為gateway-by-loadbalance的子工程,其pom.xml中的依靠情況如下,可見重點(diǎn)是spring-cloud-starter-loadbalancer:
com.bolingcavalry
common
${project.version}
org.springframework.cloud
spring-cloud-starter-gateway
io.projectreactor
reactor-test
test
org.springframework.boot
spring-boot-starter-test
test
org.springframework.cloud
spring-cloud-starter-loadbalancer
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
發(fā)動(dòng)類的代碼省去了(和前文的一樣)
裝備信息如下,重點(diǎn)是uri的值lb://provider-hello,用了前綴lb:,后邊的provider-hello就是在nacos注冊(cè)的服務(wù)名:
server:
#服務(wù)端口
port: 8085
spring:
application:
name: gateway-by-loadbalance
cloud:
nacos:
# 注冊(cè)中心的裝備
discovery:
server-addr: 127.0.0.1:8848
gateway:
routes:
- id: path_route_lb
uri: lb://provider-hello
predicates:
- Path=/lbtest/**
單元測(cè)驗(yàn)類:
package com.bolingcavalry.gateway;
import com.bolingcavalry.common.Constants;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.reactive.AutoConfigureWebTestClient;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.web.reactive.server.WebTestClient;
import static org.junit.jupiter.api.Assertions.assertTrue;
@SpringBootTest
@ExtendWith(SpringExtension.class)
@AutoConfigureWebTestClient
public class HelloTest {
@Autowired
private WebTestClient webClient;
@Test
void testLoadBalance() {
webClient.get()
.uri("/lbtest/str")
.accept(MediaType.APPLICATION_JSON)
.exchange()
// 驗(yàn)證狀況
.expectStatus().isOk()
// 驗(yàn)證成果,留意成果是字符串格局
.expectBody(String.class).consumeWith(result -> assertTrue(result.getResponseBody().contains(Constants.LB_PREFIX)));
}
}
運(yùn)行單元測(cè)驗(yàn),經(jīng)過,可見上述裝備可以經(jīng)過前綴lb:精確找到服務(wù):
支撐在nacos上裝備
將一切裝備信息寫在application.yml中有個(gè)問題:不能長(zhǎng)途裝備,這在應(yīng)用數(shù)量較多的場(chǎng)景就不方便了,好在nacos供給了長(zhǎng)途裝備的才能,應(yīng)用發(fā)動(dòng)后可以從nacos獲得自己的裝備信息,我們來試試
新增名為gateway-nacos-config的子工程,其pom.xml中的依靠情況如下,請(qǐng)留意里邊的中文注釋,每指明了每一個(gè)依靠的作用:
com.bolingcavalry
common
${project.version}
org.springframework.cloud
spring-cloud-starter-gateway
io.projectreactor
reactor-test
test
org.springframework.boot
spring-boot-starter-test
test
org.springframework.cloud
spring-cloud-starter-bootstrap
org.springframework.cloud
spring-cloud-starter-loadbalancer
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
本地的裝備文件bootstrap.yml,非常簡(jiǎn)略,就是nacos的地址和長(zhǎng)途裝備信息:
spring:
application:
name: gateway-nacos-config
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
file-extension: yml
group: DEFAULT_GROUP
接下來再nacos添加一個(gè)裝備文件,操作如下圖紅框:
添加一個(gè)裝備,要留意的地方如下(裝備信息的文本稍后給出,便于仿制):
上圖中完整的裝備信息如下:
server:
port: 8083
spring:
cloud:
gateway:
routes:
- id: path_route_addr
uri: http://127.0.0.1:8082
predicates:
- Path=/hello/**
- id: path_route_lb
uri: lb://provider-hello
predicates:
- Path=/lbtest/**
測(cè)驗(yàn)類中的兩個(gè)測(cè)驗(yàn)辦法如下所示,和前面沒有任何區(qū)別:
@Test
void testHelloPredicates() {
webClient.get()
.uri("/hello/str")
.accept(MediaType.APPLICATION_JSON)
.exchange()
// 驗(yàn)證狀況
.expectStatus().isOk()
// 驗(yàn)證成果,留意成果是字符串格局
.expectBody(String.class).consumeWith(result -> assertTrue(result.getResponseBody().contains(Constants.HELLO_PREFIX)));
}
@Test
void testLoadBalance() {
webClient.get()
.uri("/lbtest/str")
.accept(MediaType.APPLICATION_JSON)
.exchange()
// 驗(yàn)證狀況
.expectStatus().isOk()
// 驗(yàn)證成果,留意成果是字符串格局
.expectBody(String.class).consumeWith(result -> assertTrue(result.getResponseBody().contains(Constants.LB_PREFIX)));
}
運(yùn)行單元測(cè)驗(yàn)類,測(cè)驗(yàn)經(jīng)過,證明從nacos獲取裝備文件成功:
寫代碼的辦法裝備
前面的幾個(gè)例子,路由信息都是寫在裝備文件中的,其實(shí)還有一種辦法:寫代碼裝備路由,能自己寫代碼來裝備,這靈敏性就更強(qiáng)了
新增名為gateway-by-code的子工程,其pom.xml文件參照前面工程的即可
接下來的本例的重點(diǎn),在裝備類中添加一個(gè)RouteLocator類型的bean,經(jīng)過以下代碼即可添加一個(gè)路由:
package com.bolingcavalry.gateway.cofig;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RouteConfig {
@Bean
public RouteLocator customizeRoute(RouteLocatorBuilder builder) {
return builder
.routes()
.route(
// 第一個(gè)參數(shù)是路由的唯一身份
"path_route_lb",
// 第二個(gè)參數(shù)是個(gè)lambda實(shí)現(xiàn),
// 設(shè)置了配套條件是依照請(qǐng)求路徑匹配,以及轉(zhuǎn)發(fā)地址,
// 留意lb://表示這是個(gè)服務(wù)名,要從
r -> r.path("/lbtest/**").uri("lb://provider-hello")
)
.build();
}
}
上述代碼只裝備了一個(gè)路由,還有一個(gè)在裝備文件中,這樣就能驗(yàn)證代碼和裝備文件能不能同時(shí)收效了:
server:
#服務(wù)端口
port: 8084
spring:
application:
name: gateway-by-code
cloud:
nacos:
discovery:
# nacos服務(wù)地址
server-addr: 127.0.0.1:8848
gateway:
routes:
- id: path_route_addr
uri: http://127.0.0.1:8082
predicates:
- Path=/hello/**
測(cè)驗(yàn)類和之前工程的一模一樣,就不占用篇幅了,依舊是兩個(gè)測(cè)驗(yàn)辦法testHelloPredicates和testLoadBalance
履行單元測(cè)驗(yàn)可以順利經(jīng)過,證明代碼裝備路由沒有問題:
至此,負(fù)載均衡、nacos裝備、代碼裝備的實(shí)例我們都測(cè)驗(yàn)過了,它們合起來會(huì)給實(shí)踐生存環(huán)境的裝備帶來很大的方便,期望可以給您一些參閱