注册中心eureka

  最近在忙一些其它的事情,两个城市来回跑还要办一些手续,挺费劲的,学习的事情也就耽误了一些,尽量赶吧。

  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的实现原理及机制

posted @ 2018-06-10 23:43  facelessvoidwang  阅读(255)  评论(0编辑  收藏  举报