新聞中心
基于阿里開(kāi)源的Sentinel實(shí)現(xiàn)了服務(wù)的限流與容錯(cuò),并詳細(xì)介紹了Sentinel的核心技術(shù)與配置規(guī)則。簡(jiǎn)單介紹了服務(wù)網(wǎng)關(guān),并對(duì)SpringCloud Gateway的核心架構(gòu)進(jìn)行了簡(jiǎn)要說(shuō)明,也在項(xiàng)目中整合了SpringCloud Gateway網(wǎng)關(guān)實(shí)現(xiàn)了通過(guò)網(wǎng)關(guān)訪問(wèn)后端微服務(wù)。

創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括珠暉網(wǎng)站建設(shè)、珠暉網(wǎng)站制作、珠暉網(wǎng)頁(yè)制作以及珠暉網(wǎng)絡(luò)營(yíng)銷策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,珠暉網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到珠暉省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
同時(shí),也基于SpringCloud Gateway整合Sentinel實(shí)現(xiàn)了網(wǎng)關(guān)的限流功能,詳細(xì)介紹了SpringCloud Gateway網(wǎng)關(guān)的核心技術(shù)。在鏈路追蹤章節(jié),我們開(kāi)始簡(jiǎn)單介紹了分布式鏈路追蹤技術(shù)與解決方案,隨后在項(xiàng)目中整合Sleuth實(shí)現(xiàn)了鏈路追蹤,并使用Sleuth整合ZipKin實(shí)現(xiàn)了分布式鏈路追蹤的可視化 。
在消息服務(wù)章節(jié),我們介紹了MQ的使用場(chǎng)景,引入MQ后的注意事項(xiàng)以及MQ的選型對(duì)比,在項(xiàng)目中整合了RocketMQ,并給大家介紹了RocketMQ的核心技術(shù)。
在服務(wù)配置章節(jié),我們首先介紹了服務(wù)配置與Nacos作為配置中心的相關(guān)概念,并在項(xiàng)目中整合了Nacos配置中心。接下來(lái),就基于Nacos實(shí)現(xiàn)動(dòng)態(tài)刷新與配置共享。
本章總覽?
注意:本章中在測(cè)試每個(gè)案例時(shí),都需要啟動(dòng)Nacos,Sentinel,ZipKin和RocketMQ。?
細(xì)心的小伙伴可能已經(jīng)發(fā)現(xiàn)了,之前我們將微服務(wù)的配置放入了Nacos,但是此時(shí)如果在Nacos中修改了配置,程序是無(wú)法讀取到修改后的配置的。所以,我們需要實(shí)現(xiàn)動(dòng)態(tài)刷新的功能。
「注意:為了描述上的簡(jiǎn)便,這里,我們就以用戶微服務(wù)舉例說(shuō)明,其他微服務(wù)的實(shí)現(xiàn)方式都是一樣的。」
修改Nacos配置
在Nacos中修改server-user-dev.yaml的配置,在server-user-dev.yaml配置中新增如下內(nèi)容。
author:
name: binghe
如下所示。
點(diǎn)擊發(fā)布后會(huì)彈出如下提示。
直接點(diǎn)擊確認(rèn)發(fā)布即可。
通過(guò)IOC容器獲取Nacos配置
(1)在用戶微服務(wù)shop-user的io.binghe.shop.user.controller包下新建NacosController類,并在NacosController類中注入org.springframework.context.ConfigurableApplicationContext類,通過(guò)ConfigurableApplicationContext獲取到系統(tǒng)環(huán)境變量,并從環(huán)境變量中獲取到author.name屬性的值,就是我們?cè)贜acos中配置的作者姓名,如下所示。
/**
* @author binghe
* @version 1.0.0
* @description 從Nacos中獲取配置項(xiàng)
*/
@Slf4j
@RestController
public class NacosController {
@Autowired
private ConfigurableApplicationContext context;
@GetMapping("/nacos/test")
public String nacosTest(){
String authorName = context.getEnvironment().getProperty("author.name");
log.info("獲取到的作者姓名為:{}", authorName);
return authorName;
}
}
(2)啟動(dòng)用戶微服務(wù)和網(wǎng)關(guān)服務(wù),并在瀏覽器中輸入http://localhost:10001/server-user/user/nacos/test,如下所示。
可以看到,能夠正確讀取到Nacos中的配置信息。
(3)修改Nacos中server-user-dev.yaml的配置,將author.name的值修改為binghe001,如下所示。
點(diǎn)擊發(fā)布。
(4)發(fā)布后,不要重啟用戶微服務(wù)和網(wǎng)關(guān)服務(wù),在瀏覽器上刷新http://localhost:10001/server-user/user/nacos/test鏈接,發(fā)現(xiàn)讀取到的信息已經(jīng)變成了binghe001,如下所示。
可以看到,通過(guò)IOC容器能夠讀取到Nacos中修改后的配置。
通過(guò)注解獲取Nacos配置
(1)在用戶微服務(wù)shop-user的io.binghe.shop.user.controller.NacosController類上添加@RefreshScope注解,并將Nacos中的author.name的值注入到NacosController類中,并通過(guò)接口獲取到注入的Nacos中的author.name值,如下所示。
/**
* @author binghe
* @version 1.0.0
* @description 從Nacos中獲取配置項(xiàng)
*/
@Slf4j
@RefreshScope
@RestController
public class NacosController {
@Autowired
private ConfigurableApplicationContext context;
@Value("${author.name}")
private String nacosAuthorName;
@GetMapping("/nacos/test")
public String nacosTest(){
String authorName = context.getEnvironment().getProperty("author.name");
log.info("獲取到的作者姓名為:{}", authorName);
return authorName;
}
@GetMapping("/nacos/name")
public String nacosName(){
log.info("從Nacos中獲取到的作者的姓名為:{}", nacosAuthorName);
return nacosAuthorName;
}
}
(2)啟動(dòng)用戶微服務(wù)和網(wǎng)關(guān)服務(wù),并在瀏覽器中輸入http://localhost:10001/server-user/user/nacos/name,如下所示。
(3)修改Nacos中server-user-dev.yaml的配置,將author.name的值修改為binghe002,如下所示。
(4)發(fā)布后,不要重啟用戶微服務(wù)和網(wǎng)關(guān)服務(wù),在瀏覽器上刷新http://localhost:10001/server-user/user/nacos/name鏈接,發(fā)現(xiàn)讀取到的信息已經(jīng)變成了binghe002,如下所示。
說(shuō)明使用注解的方式也能夠讀取到Nacos中更新后的配置信息。
注意:雖然通過(guò)IOC容器和注解都能夠讀取到Nacos中更新后的配置信息,但是在實(shí)際項(xiàng)目中,推薦使用注解的方式獲取Nacos中更新后的配置信息。
實(shí)現(xiàn)配置共享?
一般情況下,開(kāi)發(fā)項(xiàng)目的過(guò)程中會(huì)包含:開(kāi)發(fā)環(huán)境、測(cè)試環(huán)境、預(yù)發(fā)布環(huán)境和生成環(huán)境,每個(gè)環(huán)境中的配置大部分是相同的,有少部分配置不同,如果我們能夠?qū)⒋蟛糠窒嗤呐渲贸槿〕鰜?lái),讓同一個(gè)微服務(wù)在不同的環(huán)境中共享,則能夠大大降低我們的維護(hù)成本。
另外,如果使用的是相同的技術(shù)棧的話,對(duì)于每個(gè)微服務(wù)來(lái)說(shuō),可能大部分的配置也是相同的,如果我們將這些相同的配置抽取出來(lái)讓各個(gè)微服務(wù)共享,則能夠進(jìn)一步降低維護(hù)成本。
所以,實(shí)現(xiàn)配置共享可以從 「單服務(wù)多環(huán)境配置和多服務(wù)配置」 兩個(gè)角度來(lái)思考。
單服務(wù)多環(huán)境實(shí)現(xiàn)共享
實(shí)現(xiàn)單個(gè)微服務(wù)在多個(gè)不同環(huán)境中的配置共享比較簡(jiǎn)單,只要在Nacos中配置一個(gè)以spring.application.name為Data ID的配置文件,并且將這個(gè)微服務(wù)在所有環(huán)境中公共的配置放進(jìn)去即可。
「注意:這里我們以用戶微服務(wù)為例進(jìn)行實(shí)現(xiàn)?!?/p>
(1)在Nacos中新建一個(gè)以server-user.yaml為Data ID的配置,并且將用戶微服務(wù)在各個(gè)環(huán)境中共有的配置復(fù)制進(jìn)去,如下所示。
其中,我們假設(shè)用戶微服務(wù)在多個(gè)環(huán)境下公共的配置如下所示。
server:
port: 8060
servlet:
context-path: /user
spring:
application:
name: server-user
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/shop?useSSL=false&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&serverTimezone=Asia/Shanghai
username: root
password: root
platform: mysql
type: com.alibaba.druid.pool.DruidDataSource
# 下面為連接池的補(bǔ)充設(shè)置,應(yīng)用到上面所有數(shù)據(jù)源中
# 初始化大小,最小,最大
initialSize: 10
minIdle: 5
maxActive: 20
# 配置獲取連接等待超時(shí)的時(shí)間
maxWait: 60000
# 配置間隔多久才進(jìn)行一次檢測(cè),檢測(cè)需要關(guān)閉的空閑連接,單位是毫秒
timeBetweenEvictionRunsMillis: 3600000
# 配置一個(gè)連接在池中最小生存的時(shí)間,單位是毫秒
minEvictableIdleTimeMillis: 3600000
validationQuery: select 1 from dual
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
# 打開(kāi)PSCache,并且指定每個(gè)連接上PSCache的大小
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
maxOpenPreparedStatements: 20
# 配置監(jiān)控統(tǒng)計(jì)攔截的filters,去掉后監(jiān)控界面sql無(wú)法統(tǒng)計(jì),'wall'用于防火墻
filters: stat
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
http:
encoding:
enabled: true
charset: UTF-8
force: true
mybatis-plus:
global-config:
db-config:
id-type: auto
field-strategy: not-empty
table-underline: true
db-type: oracle
logic-delete-value: 1
logic-not-delete-value: 0
mapper-locations: classpath:/mapper/*.xml
configuration:
jdbc-type-for-null: 'null'
rocketmq:
name-server: 127.0.0.1:9876
點(diǎn)擊發(fā)布。
(2)將Nacos中用戶微服務(wù)在開(kāi)發(fā)環(huán)境下的配置server-user-dev.yaml修改成如下所示。
author:
name: binghe_dev
如下所示。
點(diǎn)擊發(fā)布。
(3)在Nacos中添加用戶微服務(wù)在測(cè)試環(huán)境下的配置server-user-test.yaml,配置中的主要內(nèi)容如下所示。
author:
name: binghe_test
具體如下所示。
點(diǎn)擊發(fā)布。
(4)此時(shí)Nacos中的配置如下所示。
(5)查看用戶微服務(wù)中bootstrap.yml文件的配置,如下所示。
spring:
application:
name: server-user
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
group: user_group
profiles:
active: dev
可以看到,此時(shí)bootstrap.yml文件中配置的是環(huán)境是dev,表示開(kāi)發(fā)環(huán)境。
(6)啟動(dòng)用戶微服務(wù)和網(wǎng)關(guān)服務(wù),在瀏覽器中輸入http://localhost:10001/server-user/user/nacos/name,如下所示。
可以看到,正確獲取到了Nacos中server-user-dev.yaml配置中的author.name的值。
(7)將用戶微服務(wù)的bootstrap.yml文件中的環(huán)境變量修改成test,如下所示。
spring:
profiles:
active: test
(8)重啟用戶微服務(wù),在瀏覽器中輸入http://localhost:10001/server-user/user/nacos/name,如下所示。
可以看到,正確獲取到了Nacos中server-user-test.yaml配置中的author.name的值。
綜上:我們正確實(shí)現(xiàn)了單個(gè)微服務(wù)在多個(gè)不同環(huán)境下的公共配置的共享操作。
多服務(wù)配置實(shí)現(xiàn)共享
不同的微服務(wù)之間實(shí)現(xiàn)公共的配置共享也比較簡(jiǎn)單,在Nacos中定義一個(gè)公共配置,然后在當(dāng)前的配置中引入即可。具體的實(shí)現(xiàn)步驟如下所示。
(1)在Nacos中新建一個(gè)以server-all.yaml為Data ID的配置,配置中的主要內(nèi)容為用戶微服務(wù)、商品微服務(wù)和訂單微服務(wù)共有的配置,如下所示。
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/shop?useSSL=false&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&serverTimezone=Asia/Shanghai
username: root
password: root
platform: mysql
type: com.alibaba.druid.pool.DruidDataSource
# 下面為連接池的補(bǔ)充設(shè)置,應(yīng)用到上面所有數(shù)據(jù)源中
# 初始化大小,最小,最大
initialSize: 10
minIdle: 5
maxActive: 20
# 配置獲取連接等待超時(shí)的時(shí)間
maxWait: 60000
# 配置間隔多久才進(jìn)行一次檢測(cè),檢測(cè)需要關(guān)閉的空閑連接,單位是毫秒
timeBetweenEvictionRunsMillis: 3600000
# 配置一個(gè)連接在池中最小生存的時(shí)間,單位是毫秒
minEvictableIdleTimeMillis: 3600000
validationQuery: select 1 from dual
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
# 打開(kāi)PSCache,并且指定每個(gè)連接上PSCache的大小
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
maxOpenPreparedStatements: 20
# 配置監(jiān)控統(tǒng)計(jì)攔截的filters,去掉后監(jiān)控界面sql無(wú)法統(tǒng)計(jì),'wall'用于防火墻
filters: stat
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
http:
encoding:
enabled: true
charset: UTF-8
force: true
mybatis-plus:
global-config:
db-config:
id-type: auto
field-strategy: not-empty
table-underline: true
db-type: oracle
logic-delete-value: 1
logic-not-delete-value: 0
mapper-locations: classpath:/mapper/*.xml
configuration:
jdbc-type-for-null: 'null'
具體配置如下所示。
點(diǎn)擊發(fā)布,接下來(lái)就是在Nacos中修改各個(gè)微服務(wù)的配置,將各個(gè)微服務(wù)的配置中公共的配置刪除。
(2)在Nacos中修改server-user.yaml的配置,修改后的配置如下所示。
server:
port: 8060
servlet:
context-path: /user
spring:
application:
name: server-user
rocketmq:
name-server: 127.0.0.1:9876
具體如下所示。
點(diǎn)擊發(fā)布。
(3)在Nacos中修改server-product-dev.yaml的配置,修改后的配置如下所示。
server:
port: 8070
servlet:
context-path: /product
spring:
application:
name: server-product
具體如下所示。
點(diǎn)擊發(fā)布。
(4)在Nacos中修改server-order-dev.yaml的配置,修改后的配置如下所示。
server:
port: 8080
tomcat:
max-threads: 20
servlet:
context-path: /order
spring:
application:
name: server-order
cloud:
sentinel:
transport:
port: 9999
dashboard: 127.0.0.1:8888
web-context-unify: false
feign:
sentinel:
enabled: true
rocketmq:
name-server: 127.0.0.1:9876
producer:
group: order-group
具體如下所示。
點(diǎn)擊發(fā)布。
(5)修改用戶微服務(wù)shop-user中的bootstrap.yml文件,修改后的配置如下所示。
spring:
application:
name: server-user
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
group: user_group
shared-configs[0]:
data_id: server-all.yaml
group: all_group
refresh: true
profiles:
active: dev
(6)修改商品微服務(wù)shop-product中的bootstrap.yml文件,修改后的配置如下所示。
spring:
application:
name: server-product
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
group: product_group
shared-configs[0]:
data_id: server-all.yaml
group: all_group
refresh: true
profiles:
active: dev
(7)修改訂單微服務(wù)shop-order中的bootstrap.yml文件,修改后的配置如下所示。
spring:
application:
name: server-order
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
group: order_group
shared-configs[0]:
data_id: server-all.yaml
group: all_group
refresh: true
profiles:
active: dev
(8)分別啟動(dòng)用戶微服務(wù),商品微服務(wù),訂單微服務(wù)和服務(wù)網(wǎng)關(guān),在瀏覽器中輸入localhost:10001/server-order/order/submit_order?userId=1001&productId=1001&count=1,如下所示。
可以看到,瀏覽器中正確輸出了結(jié)果信息。
查看各個(gè)微服務(wù)中也會(huì)打印出相關(guān)的日志,如下所示。
- 用戶微服務(wù)會(huì)打印出如下信息
獲取到的用戶信息為:{"address":"北京","id":1001,"password":"c26be8aaf53b15054896983b43eb6a65","phone":"13212345678","username":"binghe"}
用戶微服務(wù)收到了訂單信息:{"address":"北京","id":15235872727371776,"phone":"13212345678","totalPrice":2399.00,"userId":1001,"username":"binghe"}- 商品微服務(wù)會(huì)打印出如下信息
獲取到的商品信息為:{"id":1001,"proName":"華為","proPrice":2399.00,"proStock":9999}
更新商品庫(kù)存?zhèn)鬟f的參數(shù)為: 商品id:1001, 購(gòu)買數(shù)量:1- 訂單微服務(wù)會(huì)打印出如下信息
提交訂單時(shí)傳遞的參數(shù):{"count":1,"empty":false,"productId":1001,"userId":1001}
庫(kù)存扣減成功- 網(wǎng)關(guān)服務(wù)會(huì)打印出如下信息
執(zhí)行前置過(guò)濾器邏輯
執(zhí)行后置過(guò)濾器邏輯
訪問(wèn)接口主機(jī): localhost
訪問(wèn)接口端口: 10001
訪問(wèn)接口URL: /server-order/order/submit_order
訪問(wèn)接口URL參數(shù): userId=1001&productId=1001&count=1
訪問(wèn)接口時(shí)長(zhǎng): 863ms
說(shuō)明我們的項(xiàng)目中成功整合了Nacos的配置中心,并實(shí)現(xiàn)了配置的動(dòng)態(tài)刷新和共享。
網(wǎng)站名稱:服務(wù)配置:實(shí)現(xiàn)動(dòng)態(tài)刷新與配置共享
鏈接URL:http://fisionsoft.com.cn/article/ccdspec.html


咨詢
建站咨詢
