聊聊服务发现注册

服务多,迭代快是微服务的明显特征。那么在快速小版本迭代业务时,如果按照传统的方式发布更新服务,手动的修改一些服务与服务之间的调用关系是非常麻烦且累人的。一个典型的场景可能是,一个微服务升级迭代之后,硬件环境发生改变(IP等的变化)。传统的做法是修改与其有调用关系的微服务调用地址然后一个个重启。这显然是非常麻烦又容易出错的。而服务发现与注册就是帮你把上述一系列的工作给封装好实现自动发现注册的服务去更新。集体为所有的微服务启动时都去注册中心登记,不管是调用者还是服务提供者,都通过注册中心完成服务的发现。这样就大大提升了我们实际工作中的效率问题。

当前流行的服务发现与注册组件

当前世面的服务注册发现框架很多,比较常见的有Zookeeper、SpringCloudEureka、Consul、Etcd等。这里只做简单介绍。具体还以实际场景做出选择。

  • Zookeeper
    相信大家对它绝对不会陌生了,非常老牌子的分布式协调服务框架。由Google开源并且是Hadoop和Hbase的重要组件,提供了数据-发布订阅、负载均衡、分布式同步等功能。其内部为命名空间拥有一个树状的内存模型,其中各节点被称为znode。每个znode包含一个路径和与之相关的元数据。
  • Consul
    由HashiCorp基于Go语言开发的支持多数据中心分布式高可用的服务发布和注册服务框架,采用Raft算法保证服务的一致性。详细可查看其官网(这里也有Consul与其他类似产品的对比哦)
  • Etcd
    由CoreOS团队发起并开源的项目,Go语言实现,本质上是高可用的分部署K-V数据库。常用做解决服务发现问题。Kubernetes就是使用它作为其数据后端的。
  • Eureka
    由Netflix开源,并被Pivatal集成到SpringCloud中,可以和SpringCloud无缝对接。基于RestfulAPI开发的服务注册与发现组件。但是目前Eureka仅开源到1.x版本,后续版本已经不再开源。

上述组件的比较

ZookeeperEurekaConsulEtcd功能
keepalive客户主动报心跳服务状态,内存,磁盘等连接心跳健康检查
N  | Y    | Y   | N  |多数据中心

Y |Y  | Y  |Y|SpringCloud集成
ACL     | NA    | ACL/https   |Https|安全
客户端     | Java/Http    | Http/dns   |Http/grpc|客户端接口
CP     | AP    | CA   | CP | CAP
Paxos     | 定制P2P    | Raft   |Raft|一致性协议
Y     | N    | Y   |Y|KV存储

项目搭建

  • 先附上GitHub地址

  • 具体步骤

    		
    				org.springframework.boot
    				spring-boot-starter-parent
    				2.0.5.RELEASE
    						
    
    		cn.kxtop.blog
    		spring-cloud-demo
    		0.0.1-SNAPSHOT
    		spring-cloud-demo
    		Demo project for Spring Boot
    
    		
    				1.8
    				Finchley.SR1
    		
    
    		
    				
    						
    								org.springframework.cloud
    								spring-cloud-dependencies
    								${spring-cloud.version}
    								pom
    								import
    						
    				
    		
    
    		
    				
    						org.springframework.boot
    						spring-boot-starter
    				
    
    				
    						org.projectlombok
    						lombok
    						true
    				
    
    				
    						org.springframework.boot
    						spring-boot-starter-test
    						test
    						
    								
    										org.junit.vintage
    										junit-vintage-engine
    								
    						
    				
    
    		
    
    		
    				
    						
    								org.springframework.boot
    								spring-boot-maven-plugin						
    				
    		
    spring-cloud-democn.kxtop.blog0.0.1-SNAPSHOT4.0.0eurekaorg.springframework.cloudspring-cloud-starter-netflix-eureka-serverorg.springframework.bootspring-boot-starter-actuatororg.springframework.bootspring-boot-starter-testtestorg.springframework.bootspring-boot-maven-plugin
    # Eureka支持集群间互相注册,这里为了方便只搭建一台,生产环境中请搭建集群并修改	eureka.client.registerWithEureka = false eureka.client.fetchRegistry = false配置
    spring.application.name = eureka-registry
    logging.level.org.spring.framework.security=INFO
    eureka.instance.prefer-ip-address = true
    eureka.client.registerWithEureka = false
    eureka.client.fetchRegistry = false
    eureka.server.waitTimeInMsWhenSyncEmpty = 0
    server.port = 8761
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
    
    @EnableEurekaServer
    @SpringBootApplication
    public class EurekaApplication {
    
    		public static void main(String[] args) {
    				SpringApplication.run(EurekaApplication.class, args);
    		}
    
    }
    • 配置完成,启动main方法。至此SpringCloud集成Eureka就完成了。最后可访问 localhost:8761查看。
      微服务实战——SpringCloud下的服务发现与注册组件Eureka集成_微服务
    • 创建启动类,包名为package cn.kxtop.blog.registry
    • 在resources目录下创建application.properties配置文件
    • 接下来创建model,packing选择jar,parent选择刚刚创建好的Spring-cloud-demo主项目。model名为eureka
    • eureka pom文件。这里主要引入了Eureka的服务提供者(Eureka Server)依赖
    • 使用IDEA创建Maven项目,输入groupID等信息,名称为spring-cloud-demo,选择pom类型
      微服务实战——SpringCloud下的服务发现与注册组件Eureka集成_微服务_02
    • 主pom文件配置如下

最后

下一篇,测试创建业务项目并测试Eureka服务注册与发现。