最近在忙一些其它的事情,两个城市来回跑还要办一些手续,挺费劲的,学习的事情也就耽误了一些,尽量赶吧。
spring cloud为分布式的微服务架构提供了一站式的解决方案,eureka注册中心在spring cloud的架构中占据了非常重要的角色,这使得我们有必要认真理清eureka的设计和使用思路。说起注册中心,用过dubbo的话会直接联想到zookeeper,我们先暂时不管他们的异同以及spring cloud的整体结构,先来看一下它是怎么使用的,然后再来看跟zk的区别。
--------------------------------------------------------------------------------------------------------------------
注册中心,当然就是让别的服务把信息注册到自己,然后供消费者使用的这么个应用。这里涉及三个角色:注册中心、服务生产者跟服务消费者,我们分别搭建这三个服务,来看一下三者是如何使用的。
1、搭建eureka-server
eureka服务端的部署有两种方式:1、直接下载war包放入tomcat的webapp下;2、spring boot开启eureka服务端,实际跟1是类似的。
第一种方式我没有尝试成功,一直报一个连接错误的异常,应该是默认连接自己失败导致的,但配置文件中没看到相关配置,,,,跳过,以后有时间了再搞。
第二种方式:搭建spring boot项目,pom文件配置如下:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9.RELEASE</version> <relativePath/> </parent> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
pom文件中,parent信息用于继承spring boot的基础默认配置,这个spring boot的parent实际是个空项目,只有一个pom文件,包含一些版本号等信息;dependencyManagement是用于描述Spring cloud所依赖的版本信息;因为spring boot跟spring cloud版本有对应关系,不能随意匹配版本;还有要注意的是此处eureka的依赖为eureka-server,不是starter,starter是用于客户端的jar包。
在resources下新建bootstrap.yml,内容为:
spring: application: name: eureka-server
之所以在bootstrap.yml中设置,是因为该文件会优先于application.yml加载,而此设置需要提前设置。application的内容为:
#服务的描述信息,可以填写服务描述,责任联系人等信息 info: name: Eureka server contact: eureka 服务器 server: port: 8761 eureka: client: #是否注册到eureka server registerWithEureka: true #是否从服务器获取信息 fetchRegistry: false #eureka server地址 serviceUrl: defaultZone: http://127.0.0.1:8761/eureka/ server: #获取不到集群里对等服务器上的实例时,需要等待的时间,单位毫秒 waitTimeInMsWhenSyncEmpty: 0 #开启自我保护,无论如何都要剔除心跳检测异常的服务 enableSelfPreservation: true #updatePeerEurekaNodes执行间隔时间,集群信息刷新间隔时间 peerEurekaNodesUpdateIntervalMs: 100000
最后,在application.java中启用eureka服务端配置信息:
@SpringBootApplication @EnableEurekaServer public class MyEurekaApplication { public static void main(String[] args) { SpringApplication.run(MyEurekaApplication.class, args); } }
运行程序,访问 http://localhost:8761
2、生产者搭建
同样的spring boot项目,只是pom中的eureka换为了客户端的jar,也就是:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency>
bootsrtap.yml内容:
spring: application: name: sms-module
application.yml内容:
info: name: author:wzy,class:develop,tel:17301394307 server: port: 9003 eureka: client: registerWithEureka: true fetchRegistry: true serverUrl: defaultZone: http://127.0.0.1:8761/eureka instance: #心跳间隔 leaseRenewalIntervalInSeconds: 10
启用eureka客户端配置
@EnableEurekaClient @SpringBootApplication public class SmsApplication { public static void main(String[] args) { SpringApplication.run(SmsApplication.class, args); } }
可以看到刚起的两个服务:
3、消费者搭建
相关配置同生产者,我们此处主要看如何获取服务信息,手动创建controller如下:
@RequestMapping("/mytest") @RestController public class TestController { @Autowired DiscoveryClient discoveryClient; @RequestMapping("/test") public String test(){ List<ServiceInstance> instanceList = discoveryClient.getInstances("sms-module"); StringBuffer sb = new StringBuffer(); for(int i=0; i<instanceList.size(); i++){ ServiceInstance instance = instanceList.get(i); String host = instance.getHost(); int port = instance.getPort(); String result = new RestTemplate().getForObject("http://"+host+":"+port+"/sms/sendmsg",String.class); sb.append(result+","); } return sb.toString(); } }
其中,DiscoveryClient是eureka 客户端提供的服务发现工具类,默认会自动注册到spring中;我们可以通过getInstances根据服务名称获取相关的服务实例列表,通过实例可以查看到具体的ip,端口等信息,通过RestTemplate的getForObject可以直接调用相关方法并获取返回结果,这里拿到的是返回结果的body信息;如需要获取其它信息,可以调用getForEntity来获取。直接访问
http://localhost:8080/mytest/test
生产者的代码及信息输出:
可以看到,消费者调用了getForObject后,生产者对应服务实例的相关代码也执行了。
------------------------------------------------------------------------------------------------------------------------------
就这样吧,先做个简单的了解,接下来我们看eureka的实现原理及机制