当前位置: 首页 > news >正文

时彩网站开发江西城乡建设网站

时彩网站开发,江西城乡建设网站,做的网站太大,微信公众平台开发流程在之前的两篇教程中我们分别介绍了如何将Sentinel的限流规则存储到Nacos和Apollo中。同时#xff0c;在文末的思考中#xff0c;我都指出了这两套整合方案都存在一个不足之处#xff1a;不论采用什么配置中心#xff0c;限流规则都只能通过Nacos界面或Apollo界面来完成修改…在之前的两篇教程中我们分别介绍了如何将Sentinel的限流规则存储到Nacos和Apollo中。同时在文末的思考中我都指出了这两套整合方案都存在一个不足之处不论采用什么配置中心限流规则都只能通过Nacos界面或Apollo界面来完成修改才能得到持久化存储而在Sentinel Dashboard中修改限流规则虽然可以生效但是不会被持久化到配置中心。而在这两个配置中心里存储的数据是一个Json格式当存储的规则越来越多对该Json配置的可读性与可维护性会变的越来越差。所以下面我们就来继续探讨这个不足之处并给出相应的解决方案。本文以Apollo存储为例下一篇介绍Nacos的改在示例。 问题分析 在实际操作之前我们先通过下图了解一下之前我们所实现的限流规则持久化方案的配置数据流向图 蓝色箭头代表了限流规则由配置中心发起修改的更新路径橙色箭头代表了限流规则由Sentinel Dashboard发起修改的更新路径 从图中可以很明显的看到Sentinel Dashboard与业务服务之间本身是可以互通获取最新限流规则的这在没有整合配置中心来存储限流规则的时候就已经存在这样的机制。最主要的区别是配置中心的修改都可以实时的刷新到业务服务从而被Sentinel Dashboard读取到但是对于这些规则的更新到达各个业务服务之后并没有一个机制去同步到配置中心作为配置中心的客户端也不会提供这样的逆向更新方法。 改造方案 关于如何改造现来解读一下官方文档中关于这部分的说明 要通过 Sentinel 控制台配置集群流控规则需要对控制台进行改造。我们提供了相应的接口进行适配。 从 Sentinel 1.4.0 开始我们抽取出了接口用于向远程配置中心推送规则以及拉取规则 DynamicRuleProvider : 拉取规则 DynamicRulePublisher : 推送规则 对于集群限流的场景由于每个集群限流规则都需要唯一的 flowId因此我们建议所有的规则配置都通过动态规则源进行管理并在统一的地方生成集群限流规则。 我们提供了新版的流控规则页面可以针对应用维度推送规则对于集群限流规则可以自动生成 flowId。用户只需实现 DynamicRuleProvider 和 DynamicRulePublisher 接口即可实现应用维度推送URL: /v2/flow。 这段内容什么意思呢简单的说就是Sentinel Dashboard通过DynamicRuleProvider和DynamicRulePublisher两个接口来获取和更新应用的动态规则。默认情况下就如上一节中Sentinel Dashboard与各业务服务之间的两个箭头一个接口负责获取规则一个接口负责更新规则。 所以只需要通过这两个接口实现对配置中心中存储规则的读写就能实现Sentinel Dashboard中修改规则与配置中心存储同步的效果。 具体的配置数据流向图如下 其中绿色箭头为公共公共部分即不论从培中心修改还是从Sentinel Dashboard修改都会触发的操作。这样的话从上图的两处修改起点看所有涉及的部分都能获取到一致的限流规则了。 代码实现 下面继续说说具体的代码实现这里参考了Sentinel Dashboard源码中关于Apollo实现的测试用例。但是由于考虑到与Spring Cloud Alibaba的结合使用略作修改。 第一步修改pom.xml中的Apollo OpenAPi的依赖将scopetest/scope注释掉这样才能在主程序中使用。 dependency groupIdcom.ctrip.framework.apollo/groupId artifactIdapollo-openapi/artifactId version1.2.0/version !--scopetest/scope--/dependency第二步找到resources/app/scripts/directives/sidebar/sidebar.html中的这段代码 li ui-sref-activeactive a ui-srefdashboard.flowV1({app: entry.app}) i classglyphicon glyphicon-filter/inbsp;nbsp;流控规则 /a/li修改为 li ui-sref-activeactive a ui-srefdashboard.flow({app: entry.app}) i classglyphicon glyphicon-filter/inbsp;nbsp;流控规则 /a/li第三步在com.alibaba.csp.sentinel.dashboard.rule包下新建一个apollo包用来编写针对Apollo的扩展实现。 第四步创建Apollo的配置类定义Apollo的portal访问地址以及第三方应用访问的授权Token通过Apollo管理员账户登录在“开放平台授权管理”功能中创建具体代码如下 Configurationpublic class ApolloConfig { Bean public ConverterListFlowRuleEntity, String flowRuleEntityEncoder() { return JSON::toJSONString; } Bean public ConverterString, ListFlowRuleEntity flowRuleEntityDecoder() { return s - JSON.parseArray(s, FlowRuleEntity.class); } Bean public ApolloOpenApiClient apolloOpenApiClient() { ApolloOpenApiClient client ApolloOpenApiClient.newBuilder() .withPortalUrl(https://apollo.xxx.com) // TODO 根据实际情况修改 .withToken(open api token) // TODO 根据实际情况修改 .build(); return client; }}第五步实现Apollo的配置拉取实现。 Component(flowRuleApolloProvider)public class FlowRuleApolloProvider implements DynamicRuleProviderListFlowRuleEntity { Autowired private ApolloOpenApiClient apolloOpenApiClient; Autowired private ConverterString, ListFlowRuleEntity converter; Value(${env:DEV}) private String env; Override public ListFlowRuleEntity getRules(String appName) throws Exception { // flowDataId对应 String flowDataId sentinel.flowRules; OpenNamespaceDTO openNamespaceDTO apolloOpenApiClient.getNamespace(appName, env, default, application); String rules openNamespaceDTO .getItems() .stream() .filter(p - p.getKey().equals(flowDataId)) .map(OpenItemDTO::getValue) .findFirst() .orElse(); if (StringUtil.isEmpty(rules)) { return new ArrayList(); } return converter.convert(rules); }}getRules方法中的appName参数是Sentinel中的服务名称这里直接通过这个名字获取Apollo配置是由于Apollo中的项目AppId与之一致如果存在不一致的情况则需要自己做转换。这里注入了一个env属性主要由于我们在使用Apollo的时候通过启动参数来控制不同环境。所以这样就能在不同环境区分不同的限流配置了。这里的flowDataId对应各个微服务应用中定义的spring.cloud.sentinel.datasource.ds.apollo.flowRulesKey配置即Apollo中使用了什么key来存储限流配置。其他如Cluster、Namepsace都采用了默认值default和application这个读者有特殊需求可以做对应的修改。 第六步实现Apollo的配置推送实现。 Component(flowRuleApolloPublisher)public class FlowRuleApolloPublisher implements DynamicRulePublisherListFlowRuleEntity { Autowired private ApolloOpenApiClient apolloOpenApiClient; Autowired private ConverterListFlowRuleEntity, String converter; Value(${env:DEV}) private String env; Override public void publish(String app, ListFlowRuleEntity rules) throws Exception { String flowDataId sentinel.flowRules; AssertUtil.notEmpty(app, app name cannot be empty); if (rules null) { return; } OpenItemDTO openItemDTO new OpenItemDTO(); openItemDTO.setKey(flowDataId); openItemDTO.setValue(converter.convert(rules)); openItemDTO.setComment(modify by sentinel-dashboard); openItemDTO.setDataChangeCreatedBy(apollo); apolloOpenApiClient.createOrUpdateItem(app, env, default, application, openItemDTO); // Release configuration NamespaceReleaseDTO namespaceReleaseDTO new NamespaceReleaseDTO(); namespaceReleaseDTO.setEmergencyPublish(true); namespaceReleaseDTO.setReleaseComment(release by sentinel-dashboard); namespaceReleaseDTO.setReleasedBy(apollo); namespaceReleaseDTO.setReleaseTitle(release by sentinel-dashboard); apolloOpenApiClient.publishNamespace(app, env, default, application, namespaceReleaseDTO); }}这里的大部分内容如env、flowDataId、app说明与上一步中的实现一致openItemDTO.setDataChangeCreatedBy(apollo);和namespaceReleaseDTO.setReleasedBy(apollo);这两句需要注意一下必须设置存在并且有权限的用户不然会更新失败。 第七步修改com.alibaba.csp.sentinel.dashboard.controller.v2.FlowControllerV2中DynamicRuleProvider和DynamicRulePublisher注入的Bean改为上面我们编写的针对Apollo的实现 AutowiredQualifier(flowRuleApolloProvider)private DynamicRuleProviderListFlowRuleEntity ruleProvider;AutowiredQualifier(flowRuleApolloPublisher)private DynamicRulePublisherListFlowRuleEntity rulePublisher;代码示例 本文介绍内容的客户端代码示例读者可以通过查看下面仓库中的alibaba-sentinel-dashboard-apollo项目 Githubhttps://github.com/dyc87112/SpringCloud-Learning/Giteehttps://gitee.com/didispace/SpringCloud-Learning/ 如果您对这些感兴趣欢迎star、follow、收藏、转发给予支持 系列回顾 《Spring Cloud Alibaba基础教程使用Nacos实现服务注册与发现》《Spring Cloud Alibaba基础教程支持的几种服务消费方式》《Spring Cloud Alibaba基础教程使用Nacos作为配置中心》《Spring Cloud Alibaba基础教程Nacos配置的加载规则详解》《Spring Cloud Alibaba基础教程Nacos配置的多环境管理》《Spring Cloud Alibaba基础教程Nacos配置的多文件加载与共享配置》《Spring Cloud Alibaba基础教程Nacos的数据持久化》《Spring Cloud Alibaba基础教程Nacos的集群部署》《Spring Cloud Alibaba基础教程使用Sentinel实现接口限流》《Spring Cloud Alibaba基础教程Sentinel使用Nacos存储规则》《Spring Cloud Alibaba基础教程Sentinel使用Apollo存储规则》 专题推荐 Spring Boot基础教程Spring Cloud基础教程
http://www.pierceye.com/news/549375/

相关文章:

  • 电商购物网站m3u8插件 wordpress
  • 河北手机网站制作多少钱wordpress文章头部
  • 悠悠我心的个人网站素材网站建设教育培训
  • 网站建设定金做什么会计分录湘潭有实力的关键词优化公司
  • 网站备案 网站建设方案书云搜索app
  • 青岛网络推广建站民营医院建设网站
  • 罗湖住房和建设局网站wordpress调用内容代码
  • 网络logo设计优化设计七年级下册语文答案
  • 贵港网站seo安新网站建设
  • 网站怎么自己编辑模块创意网名大全
  • php的网站架构建设框架wordpress如何运行
  • 广州seo网站排名优化数码设计网站
  • 免费做视频相册的网站网站建设的功能描述
  • 网站建设方案浩森宇特alexa排名是什么意思
  • 网上手机网站建设计划书百度小说风云榜排名
  • 用js来做网站帝国cms这么做网站
  • 网站建设需求分析班级网站备案服务类型
  • 网站备案幕布照片怎么算合格北京专业网站开发
  • 浙江建设职业技术学院塘栖校区网站网络推广方法有几种
  • 呢图网站场建设封面长安镇做网站
  • 搜索关键词的网站黄山做网站
  • 网络建站系统去除wordpress主题头部作者信息
  • 鼓楼微网站开发番禺有经验的网站建设
  • 对网站建设心得进入公众号继续阅读怎么弄
  • 网站建设公司投诉电话可以先做网站后备案吗
  • 顺的品牌网站设计价位网站开发合同书
  • 用html5制作个人网站深圳百度国际大厦
  • 网络网站公司网站管理平台扩展插件
  • 个人小说网站怎么做把自己做的网页变成网站
  • led网站制作网站登录后不显示内容