当前位置: 首页 > 后端技术 > Java

下面说说如何同步数据到apollo配置中心

时间:2023-04-01 15:13:25 Java

前言实施过微服务项目的朋友应该对配置中心不陌生。配置中心可用于集中配置管理和配置热更新。目前市面上常见的配置中心有QConf、spring-cloud-config、diamond、disconf、apollo、nacos等,最常用的微服务项目应该是spring-cloud-config、apollo、nacos。我们可能有这样一个应用场景,先把一些配置数据落到数据库,然后再把数据持久化到配置中心。这可以分为两个步骤。第一步是将数据存入数据库,第二步是通过配置中心提供的面板,手动将数据写入配置中心。但是,我们可能更倾向于将数据入库后直接同步到配置中心。今天就以Apollo为例,说说如何同步数据到Apollo配置中心。实现思路使用Apollo提供的开放API进行操作。Step1.将我们的应用连接到Apollo开放平台。Apollo管理员在http://{portal_address}/open/manage.html创建第三方应用,创建前最好检查AppId是否已经创建。创建成功后会生成token,如下图:2.对注册的应用进行授权。Apollo管理员会在http://{portal_address}/open/manage.html页面授权token。授权后,应用可以通过Apollo提供的HttpREST接口管理授权Namespace的配置。3、应用调用ApolloOpenAPI实例演示,以将API网关路由信息同步到Apollo为例。1.创建第三方应用创建然后提示token2,根据token的appId授权第三方应用的运行,我们就可以对API网关上的所有配置进行授权。groupId>com.ctrip.framework.apolloapollo-openapi1.7.0引入之后,我们就可以直接操作apolloopenapi,查询配置项publiclonggetMaxRouteRuleIndex(){OpenNamespaceDTOopenNamespaceDTO=apolloOpenApiClient.getNamespace(appInfoProperties.getAppId(),appInfoProperties.getEnv(),appInfoProperties.getClusterName(),appInfoProperties.getNameSpaceName());列表item.getKey().matches(ID_PATTERN)).count();}运行单元测试@TestpublicvoidtestGetMaxRouteRuleIndex(){longindex=routeService.getMaxRouteRuleIndex();Assert.assertTrue(index>=0);}此时在网关b上的apollo面板,创建和发布配置项注意:apollo的创建和发布是两个不同的APIpublicbooleancreateRouteRule(RouteRulerouteRule){try{longcurRouteRuleIndex=getMaxRouteRuleIndex();buildOpenItemDTO(ROUTE_ID_KEY,curRouteRuleIndex,routeRule.getRouteId(),true);buildOpenItemDTO(ROUTE_PREDICATES_KEY,curRouteRuleIndex,routeRule.getPredicate(),true);buildOpenItemDTO(ROUTE_FILTERS_KEY,curRouteRuleIndex,routeRule.getFilter(),true);returnpublish("新网关路由","新网关路由");}catch(Exceptione){log.error("{}",e.getMessage());}返回假;}运行单元测试@TestpublicvoidtestCreateRouteRule(){RouteRulerouteRule=RouteRule.builder().routeId(appName).uri("http://localhost:8082").predicate("Path=/dashboard/**").filter("StripPrefix=1").build();booleanisSuccess=routeService.createRouteRule(routeRule);Assert.assertTrue(isSuccess);}在apollo入口查看api网关的面板,发现有路由配置因为api网关做了动态路由,所以可以在api网关的控制台找到如下输出来访问浏览器。动态路由生效b.更新发布配置项publicbooleanupdateRouteRule(RouteRulerouteRule){longruleIndex=getRouteRuleIndex(routeRule.getRouteId());if(ruleIndex!=-1){try{buildOpenItemDTO(ROUTE_URI_KEY,ruleIndex,routeRule.getUri(),false);buildOpenItemDTO(ROUTE_PREDICATES_KEY,ruleIndex,routeRule.getPredicate(),false);routeRule.getFilter(),false);returnpublish("更新网关路由","更新网关路由");}catch(Exceptione){log.error("{}",e.getMessage());}}返回假;}运行单元测试@TestpublicvoidtestUpdateRouteRule(){RouteRulerouteRule=RouteRule.builder().routeId(appName).uri("http://localhost:8082").predicate("Path=/xxx/**").filter("海峡ipPrefix=1").build();booleanisSuccess=routeService.updateRouteRule(routeRule);Assert.assertTrue(isSuccess);}在apollo入口查看api网关的面板,可以发现predicate的路径已改为xxxViewAPI在网关控制台访问浏览器,原来访问http://localhost:8000/dashboa...会出现改为访问http://localhost:8000/xxx/ops...表示路由修改成功b、删除并发布配置项publicbooleandeleteRouteRule(StringrouteId){longruleIndex=getRouteRuleIndex(routeId);if(ruleIndex!=-1){try{//removeRouteItem(ROUTE_URI_KEY,ruleIndex);//removeRouteItem(ROUTE_PREDICATES_KEY);/rule/IndexremoveRouteItem(ROUTE_FILTERS_KEY,ruleIndex);buildOpenItemDTO(ROUTE_URI_KEY,ruleIndex,"http://null",false);buildOpenItemDTO(ROUTE_PREDICATES_KEY,ruleIndex,"Path=/-9999",false);returnpublish,("删除网关路由"删除网关路由");}catch(Exceptione){log.error("{}",e.getMessage());}}返回假;}privatevoidremoveRouteItem(Stringkey,longindex){if(key.equalsIgnoreCase(ROUTE_PREDICATES_KEY)||key.equalsIgnoreCase(ROUTE_FILTERS_KEY)){key=String.format(key,index,0);}else{key=String.format(key,index);}apolloOpenApiClient.removeItem(appInfoProperties.getAppId(),appInfoProperties.getEnv(),appInfoProperties.getClusterName(),appInfoProperties.getNameSpaceName(),key,appInfoProperties.getAuthUser());}注意:由于删除网关比较复杂,涉及到路由集的重新计算,这里有一个trick来更新不可访问的路由。如果是直接物理删除,调用apollo的removeItem总结一下Apollo开放平台提供的api其实是一个httprestful操作,提供了一系列的增删改查操作。这里有个小细节,apollo的增删改查和释放是分开操作的。如果只是调用增删改查,需要在入口点击发布,或者使用发布界面进行操作。更多详情请参考Apollo的开放平台链接https://www.apolloconfig.com/#/zh/usage/apollo-open-api-platform?id=_3210-%e6%96%b0%e5%a2%9e%e9%85%8d%e7%bd%ae%e6%8e%a5%e5%8f%a3本文提供的示例仅供参考,不能直接用于生产环境。如果有朋友的配置中心使用nacos,也可以实现类似的操作。因为nacos也提供了开放的api接口,感兴趣的朋友可以查看以下链接https://nacos.io/zh-cn/docs/open-api.htmldemo链接https://github.com/lyb-geek/springboot-学习/tree/master/springboot-sync-apollo