您好,登錄后才能下訂單哦!
今天小編給大家分享一下Spring Cloud Alibaba如何實現服務的無損下線功能的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
通過一頓Debug
之后,從上圖中可知,我們獲取到可用的服務實例信息,會從緩存中獲取
,那么如果當服務下線后,我們清空這個服務的緩存的信息,那么下次在獲取這個服務的信息就是最新的了,那么問題就解決了。
服務提供方或消費方,同時監聽 Spring Cloud Config
中的某個配置文件,比如lossless
文件
服務下線時, 第一步: 從nacos
上將自身這個實例下線。 第二步: 通過api
更新lossless
文件中的內容,記錄服務下線的服務名加上時間戳
。
消費者或網關,監聽到lossless
配置文件的變更,獲取到服務名
,然后將這個服務名對應的緩存清空
。
<dependencies> <!-- 服務發現 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!-- nacos 配置 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <!-- 引入這個是為了使 @NacosConfigListener 注解生效 --> <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-spring-context</artifactId> <version>1.1.1</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <!-- 負載均衡組件 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency> <!-- 使bootstrap.yaml中的配置生效 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
@Component @Slf4j public class LosslessOfflineApi { @Resource private NacosConfigManager nacosConfigManager; @Resource private NacosServiceManager nacosServiceManager; @Resource private NacosDiscoveryProperties nacosDiscoveryProperties; /** * 服務下線 * * @throws NacosException NacosException */ public void offlineService() throws NacosException { log.info("觸發服務下線 serviceName:[{}]", nacosDiscoveryProperties.getService()); nacosServiceManager.nacosServiceShutDown(); nacosConfigManager.getConfigService() .publishConfig(NacosConstant.DATA_ID, NacosConstant.GROUP, nacosDiscoveryProperties.getService() + NacosConstant.SPLIT + System.currentTimeMillis()); } }
此處需要注意的是: 使用nacosConfigManager.getConfigService().publishConfig
發布配置,此處更新配置中的 服務名+時間戳
,如果只是更新服務名,則可能不會觸發監聽事件。
1、引入配置
<dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-spring-context</artifactId> <version>1.1.1</version> </dependency>
2、開啟注解
@Configuration @EnableNacos(globalProperties = @NacosProperties(serverAddr = "${spring.cloud.nacos.config.server-addr}") ) public class NacosConfiguration { }
@Component @RequiredArgsConstructor @Slf4j public class ListenerConfigChange { @Resource private DefaultLoadBalancerCacheManager defaultLoadBalancerCacheManager; @Resource private NacosServiceManager nacosServiceManager; @Resource private NacosDiscoveryProperties nacosDiscoveryProperties; @Resource private NacosServiceDiscovery nacosServiceDiscovery; @Resource private NacosConfigManager nacosConfigManager; @NacosConfigListener(groupId = GROUP, dataId = DATA_ID) public void configChange(String config) { log.warn("==>接收到 無損服務下線 配置變更:[{}]", config); String serviceName = config.split(SPLIT)[0]; log.info("需要無損下線的服務名:[{}]", serviceName); Cache cache = defaultLoadBalancerCacheManager.getCache(SERVICE_INSTANCE_CACHE_NAME); if (null != cache) { cache.evict(serviceName); log.info("失效serviceName:[{}]的緩存", serviceName); } } }
服務 | 端口 | 提供api | 備注 |
---|---|---|---|
nacos-lossless-gateway | 9001 | /consumer/** | 路由到consumer服務 |
nacos-feign-consumer | 9002 | /fetchProviderServerInfo | 通過feign接口,獲取provider服務的ip和port |
nacos-provider-9003 | 9003 | /shutdown | 從nacos server上下線服務,發布配置變更 |
nacos-provider-9004 | 9004 | /shutdown | 從nacos server上下線服務,發布配置變更 |
解釋:
1、通過gateway
訪問 http://localhost:9001/consumer/fetchProviderServerInfo
將會返回provider
的ip
和port
信息。
2、http://localhost:9003/shutdown
將會將自己從nacos server下線,并且操作 nacos config,變更配置文件的內容。
3、gateway
和consumer
監聽到配置變更,更新服務的緩存,從而下次訪問,不會訪問到這個下線的服務。
以上就是“Spring Cloud Alibaba如何實現服務的無損下線功能”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。