springcloud整合apollo入门学习

springcloud整合apollo入门学习

前言
   最近在上海出差,周末或者晚上之类的可以自己学学,所以想按自己的理解和学习做些微服务的demo,当然代码重构方面由于水品有限,我尽量,再加上这是第一次写博客,有什么不好的欢迎指正,也可以发送到本人邮箱,相互学习,在此谢过
为什么选择apollo

springcloud原生的配置组件是springcloudconfig,没有统一的管控界面,不方便操纵,其他的什么灰度发布之类的不说,对于我这挑剔的人来说,交互不友好的一律淘汰,除了apollo还有nacos也是很优秀的,阿里出品皆是精品嘛,至少我是这样认为的,当然现在说的是携程开源框架apollo,nacos就不过多说明了,感兴趣的可以找度娘,下面是apollo的界面,简单整洁
在这里插入图片描述

Apollo工作机制

在这里插入图片描述
1、apollo服务端可以添加修改和发布相关配置,可以时时将发布后的配置push到客户端;
2、apollo客户端可以将服务端push或者时自行定时pull的配置push给应用服务,这里的应用一般是微服务;
3、apollo客户端能获取到服务端配置是由于和服务端建立了http长连接,时时监听,具体可以看看底层源码,这不过多解释。

demo项目搭建

在这里插入图片描述

我建了四个module,cloud-common用于存放一些共性的代码,比如工具类
cloud-config用于和整合apollo获取配置,零位建了cust-service和order-service客户中心和订单中心用于启动
服务和校验,当然在这之前需要安装apollo服务端,这个自行安装即可,特别注意的是服务端启动顺序:
一定要先启动 cfg, 然后是 admin, 然后是 portal
代码我上传到git了,篇幅问题就不一一阐述,就本人认为的关键点进行说明即可,git地址在文末,需要的同学可以
自行clone
cloud-config

由于受工作的影响,个人喜欢将配置放在常量类*MDA中,一些比如xml或者.properties之类的配置文件这是需要由业务决定后扩展的,这不做介绍,其实是一样的逻辑

添加apollo客户端依赖,本人选择的是1.5.1版本
 		<dependency>
            <groupId>com.ctrip.framework.apollo</groupId>
            <artifactId>apollo-client</artifactId>
            <version>1.5.1</version>
        </dependency>

        <dependency>
            <groupId>com.ctrip.framework.apollo</groupId>
            <artifactId>apollo-core</artifactId>
            <version>1.5.1</version>
        </dependency>

做之前我考虑有几点

  1. 不能只要增加配置常量类或者添加微服务中心就需要改动config代码,耦合性太高
  2. 项目启动的时候需要将所有apollo的配置pull下来
  3. 项目运行过程中服务端发布的配置怎么获取
    针对这几点你我一一说下我的思路:分别为A、B、C吧
A 解决增加常量配置类或者增加微服务中心不改动config代码逻辑
约定包名为公司组织架构,比如本人测试的
cloud-config包路径为com.zc.study.config
cust-service包路径为com.zc.study.cust
order-service包路径为com.zc.study.order
这么做是因为在cloud-config中写了个Component组件用于中心服务启动时初始化一些东西,具体下面介绍,而
如果需要这个组件生效,中心服务依赖cloud-config,在中启动类上添加@ComponentScan(basePackages = {"com.zc.study"})即可
B 获取配置
 1.客户端创建一个Component组件实现ApplicationContextAware接口,类中写个onChange方法并在方法上添加ApolloConfigChangeListener注解即可
    @ApolloConfigChangeListener
    public void onChange(ConfigChangeEvent changeEvent) {
    }
 2. 解决apollo监听器只监听application.properties的问题
 这个解决只需要重置ApolloConfigChangeListener的value的默认值即可即可
 第一、创建一个注解用于微服务中配置类使用,moduleName和apollo服务端命名空间名称一样
 @Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface AppModule {
    String moduleName();
}
下图代码路径全路径com.zc.study.config.init.InitMDAAnnotation

在这里插入图片描述

这样就可以获取到所有apollo命名空间的配置了,一个命名空间对应代码中的一个配置类
C将获取到的配置写入常量类中

类路径com.zc.study.config.init.InitMDAAnnotation在这里插入图片描述

启动
  1. 在order-service中添加cloud-config依赖
		<dependency>
            <groupId>com.zc.study</groupId>
            <artifactId>cloud-config</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
  1. order-service配置文件application.properties中添加配置
apollo.bootstrap.eagerLoad.enable=true
apollo.bootstrap.enabled=true
apollo.bootstrap.namespaces=application,commonMDA
basePackage=com.zc.study.order.common
cmdb.isCMDB.cmdbFlag=Y

3、order-service的resources下创建META-INF/app.properties

app.properties内容:
app.id=${app.id}

4、添加启动参数

192.168.142.11是我虚拟机的IP
启动参数:-Dserver.port=18080 -Dmeta=http://192.168.142.11:8080 -Denv=dev -Dapp.id=1001  -Didc=default
参数解释:
-Dmeta:apollo-config的地址,
-Denv=dev是apollo的开发环境, -
Dapp.id是apollo上创建的应用id,代表受理中心服务;
-Didc是1001下的集群

5、order-service下创建测试controller

 @GetMapping("/getCommonMDAValues")
    public String getCommonMDAValues(){
        logger.info("attr1 value = {}", CommonMDA.attr1);
        logger.info("attr2 value = {}", CommonMDA.attr2);
        return "attr1="+CommonMDA.attr1+" ; attr2="+CommonMDA.attr2;
    }


添加restfulAPI,打印本地的CommonMDA中变量,在服务启动后请求接口,获取的配置是apollo的,在apollo上修改配置并发布,再次请求接口可以看到配置已随即改变

6、特别注意

代码配置类中的变量需要new创建对象,例如:
 public static final String attr1 = new String("this is attr1 local");

到此完成所有springcloud集成apollo的操作,当然,这代码只是用于自学并测试,肯定存在很多不完善或错误,欢迎指正!!!

在此附上代码地址:https://gitee.com/prick/cloud-demo.git

  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值