scservers(三)消息总线bus

前言

消息总线bus作为一个轻量化消息中心,通知订阅的方式,完成消息的传递,其基础的应用就是与配置中心结合,通过bus通知client来配置中心拉去更新配置。

消息总线bus

spring cloud 通过封装消息队列rabbitmq,kaffka提供我们bus的一些基础功能。发送配置更新消息。

rabbitmq

安装好rabbitmq服务端,直接使用docker-compose吧,方便。

客户端client

  • 使用bus只需要pom.xml引入如下架包配置
<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
  • 同时对rabbitmq 的连接信息进行配置:
spring:
  application:
    name: bus-server
  rabbitmq:
    host: ${RABBIT_MQ_HOST:localhost}
    port: ${RABBIT_MQ_PORT:5672}
    username: ${RABBIT_MQ_USERNAME:guest}
    password: ${RABBIT_MQ_PASSWORD:guest}

即与使用其他mq方式无异。

  • 消息队列注册
@Configuration
public class RabbitMQConfig {
    @Bean
    public Queue testhelloQueue() {
        return new Queue("testhello");
    }

}
  • 消息消费
@Component
@RabbitListener(queues = "testhello")
public class ReceiverDefault {
    private final Logger logger = LoggerFactory.getLogger(ReceiverDefault.class);

    @RabbitHandler
    public void receiver(String hello){
        logger.info("接收消息=====》》》》》{}",hello);
    }
}
  • 消息推送
@Component
public class SenderDefault {
    private final Logger logger = LoggerFactory.getLogger(SenderDefault.class);
   
    @Autowired
    private AmqpTemplate amqpTemplate;

    public void sender(String context){
        
        logger.info("发送消息=========》》》》{}",context);
        this.amqpTemplate.convertAndSend("testhello",context);
    }
}

config通知

除了常用的消息队列功能,在微服务的架构中,其与config可以深度结合进行分布式的配置变更的通知。

  • 配置

    配置中心及客户端配置见配置中心一节
  • 流程

    1. 将配置通过git发布
    2. git pull 配置http接口,像配置中心发送通知

      curl -i -X POST http://confighost:port/actuator/bus-refresh
      

      应答:

      HTTP/1.1 204
      Date: Sat, 11 Aug 2018 04:06:35 GMT
      
    3. 源码示例

      center/docker-compose-demo.yaml 文件相关内容

scservers(二) 配置中心

前言

前面介绍了服务注册发现,这个是一个比较核心的功能,还有一个服务治理相关的是配置中心,作为分布式微服务,统一设置更新成千上万的微服务配置,也已经基本成为必选项,即使你的服务没有那么多,但是热更新配置等对生产配置变动的及时更新都有帮助。

配置中心

目前配置中心这一服务比较多,国内外都有比较成熟的经过生产实践的产品,如百度的disconf,携程的apollo,springcloud 也有原生的配置中心config。国内生产用得多的应该是携程的apollo,功能强大。这里就暂时先使用springcoud全家桶,apollo后续再介绍使用。

config



configserver 依托git 完成版本管理,也有本地模式。同时为了及时更新还需要消息总线来支持其及时更新配置。

config使用

  • server

    配置中心可以将服务注册到注册中心,作为服务提供者供其他应用使用。

    1. 使用

      • 新建springboot 工程,添加config starter 傻瓜包:

        <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
        <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
      • 在工程启动类添加在工程启动类中,添加注解,启用默认config配置的默认值

        @EnableConfigServer
        
    2. 配置说明

      spring:
      application:
      name: config-server
      cloud:
      config:
      server:
      git:
      uri: https://local/willen/config.git
      searchPaths: /
    3. 示例源码

  • client

  • 5

scservers(一) 注册中心eureka

  • 以前做的项目稳态应用系统一直使用公司研发的一套C++ 的rpc调用框架的esb中间件,加上一些周边插件构成的SOA生态,在此基础上开发业务系统。
  • 后来基于互联网生态的发展壮大,一些创新型的业务我们就使用java开发。并选择了dubbo rpc 框架的作为基础调用。
  • 随后在做一些后台管理应用中接触了springboot 相关内容对java 的配置的简略,约定俗成的规则,真的好用。并想将应用系统框架也升级到springcloud 的生态中去,但是耽搁了下后spring cloud 2都出来了,终于下决心迁移整改。

    # 概要
  • 你们猜对了我们想做微服务,虽然我个人认为soa这样的已经挺好了挺规范,但是趋势还是得推动我们不断学习接受新的技术思想,比如现在都已经出来了servicemesh了,但还是先把微服务搞定吧,虽然我们认为技术细节soa跟微服务差异不大,主要在服务治理上的思想差异吧。
  • 作为这种为应用系统提供框架,提供治理能力的东西,一般需要实现这样的能力:
    1. 技术基础:容器(服务集成),路由,消息通信
    2. 核心功能模块:远程调用模块,服务发现,消息队列,分布式事务
    3. 通用功能模块:对象存储,任务调度等公用的基础工具模块
    4. 服务治理:服务限流降级,分布式配置管理

      # 服务发现

      以前我就说过,原公司自己的rpc的路由,即服务发现基于纯分布式的ospf的路由协议算法+esb总线结合实现,优点是不需要中心统一注册,可以自主发现相邻节点。

      缺点的路由寻址数量有限,需要分中心由一个节点进行截断,即路由网关。同时数据流不能直接发送到目标节点,而需要层层转发(只与相邻节点建立连接),虽然会增加不必要的网络压力,却也可以给分中心的网络隔离提供机会(路由网关可以起到跳板机作用)。这种私有协议基础上的功能在特定场景合适,但是不具有广泛性,社区活跃度,eureka这种基于rest接口的c/s结构的服务注册发现服务:便于管理,易用性,适用性强。

eureka

如上图我们可以看到服务提供方注册到eureka-server上,然后服务消费方通过eureka-client从eureka获取到可用服务,然后就可以进行直接的远程调用了。这就实现了对rpc的路由能力的治理。
如果服务较多,eureka server面临的性能压力也比较大,延时等,但是最主要的还是需要高可用能够提供持续不宕机服务。

eureka使用

  • server

    springcloud基于springboot,其开箱即用的原则让我们不需要过多配置就可以傻瓜式的使用eureka,后续源码解析留待下次。

    这里就简单列出配置与说明:

    1. 使用

      • 新建springboot工程,添加eureka starter 傻瓜架包:
      <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
      <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
      </dependency>
      • 启动类添加注解,表明事eurekaServer应用,并启用eurekaServer默认配置:
      @EnableEurekaServer // 启用 eureka server 相关默认配置 
      
    2. 简易配置说明

      server:
      port: ${EUREKA_PORT:8761}
      eureka:
      # 生产环境中官方是不建议修改默认配置,因为那样会破坏 eureka server 的保护模式
      server:
      # 关闭保护模式(生产环境不建议修改)
      enable-self-preservation: false
      # 清理间隔(默认是60 * 1000 毫秒)(生产环境不建议修改)
      eviction-interval-timer-in-ms: 60000
      # Eureka 拉取服务列表时间(默认:30秒)(生产环境不建议修改)
      remote-region-registry-fetch-interval: 5
      client:
      # eureka server 没必要自己把自己注册上去,所以可以设置成 false
      registerWithEureka: false
      # 是否从Eureka Server上获取注册信息,默认为true,此处建议修改成 false (单机设置的意义不大,如果设置成 true 启动会去抓取一次注册表,获取不到更新缓存就会出错(该错误不影响 eureka 正常使用))
      fetchRegistry: false
      serviceUrl:
      # 默认注册地址 this.serviceUrl.put("defaultZone", "http://localhost:8761/eureka/");
      # 划重点:此处的 defaultZone 千万别写成 default-zone
      defaultZone: http://${EUREKA_ZONE_HOST:localhost}:${EUREKA_ZONE_PORT:8761}/eureka/
      spring:
      application:
      name: eureka-server
    3. 示例源码

  • client