Eureka服务注册与发现--入门

版权声明:本文为CSDN原创投稿文章,转载请标明原创地址! https://blog.csdn.net/qq_27046951/article/details/82880609

Eureka介绍
Eureka是Netflix开发的服务发现组件,本身是一个基于REST的服务。Spring Cloud将它集成在其子项目spring-cloud-netflix中,以实现Spring Cloud的服务注册与发现功能。
Eureka的架构
在这里插入图片描述

  • 服务器端(服务注册中心)
    Eureka提供的服务器端,用于提供服务注册与发现功能,Eureka没有提供后台的存储而是将服务保存在内存的注册中心,通过心跳来保持最新状态
  • 服务提供者
    服务提供者是Eureka的客户端,向服务端注册服务、向服务器发送心跳、获取服务注册列表。当服务注册到服务端时,会提供自己的元信息(主机、端口、服务名等)
  • 服务消费者
    对于注册发布到服务端的服务,服务消费者可以对其进行查找与调用,服务调用者也是一个Eureka客户端,但其主要职责是查找与调用服务。

Eureka的服务治理机制
在这里插入图片描述

  • 服务提供者

    • 服务注册
      服务提供者在启动的时候会通过发送REST请求的方式将自己注册到Eureser服务器,同时携带了自身服务的一些元数据信息。
    • 服务同步
      集群模式下会有多个Eureka服务器,如上图,服务提供者将服务分别注册到了两个不同的Eureka服务器,他们的信息分别被两个Eureka服务器维护,而Eureka服务器之间也相互注册为服务,当一个服务提供者注册服务的REST请求到达Eureka服务器后,该Eureka服务器会将请求转发给集群中相连的其它Eureka服务器,从而实现服务的同步。
    • 服务续约
      在服务注册成功后,服务提供者会维护一个心跳(默认为每隔30秒)给Eureka服务器,以防止Eureka服务器将服务剔除!
    • 服务下线
      在服务运行的过程中会面临关闭和重启服务的情况,在服务关闭期间,我们不希望服务消费者来继续调用关闭了的服务,所以在服务端进行正常的关闭时,会触发一个下线的REST请求给Eureka服务器,服务器接收到请求后,会将该服务于标记为下线,并广播给其它服务器。
  • 服务消费者

    • 获取服务
      当我们启动服务消费者的时候,它会发送一个REST请求给Eureka服务器,来获取服务器上成功注册的服务。
    • 服务调用
      服务消费者获取到注册的服务后,可以通过服务名来调用服务,在Ribbon中会采用轮询的方式来进行调用,从而实现客户端的负载均衡。
  • Eureka服务器(服务注册发现中心)

    • 失效剔除
      有些时候,服务并不一定会正常下线,可能由于内存溢出或者网络故障导致服务无法继续工作,Eureka服务器并没有收到下线请求。为了从服务列表中清除不能正常工作的服务,Eureka服务器在启动的时候会创建一个定时任务,默认每隔60秒将当前服务列表中超过90秒没有发送心跳的服务剔除出去。
    • 自我保护
      在这里插入图片描述
      该警告就是发出了Eureka的自我保护机制!服务注册到Eureka服务器后,会向其发送心跳,Eureka在运行期间,会统计心跳失败的比率在15分钟是否低于85%,如果低于,Eureka服务器会将这些服务保护起来,不会剔除。

简单Eureka应用
在这里插入图片描述

  • 构建Eureka服务

    • pom.xml文件中添加依赖

      <!--添加eureka服务端的依赖-->
      <dependency>
      	<groupId>org.springframework.cloud</groupId>
      	<artifactId>spring-cloud-starter-eureka-server</artifactId>
      </dependency>
      
    • 在application.yml文件中进行配置

      #配置服务端口
      server:
        port: 8761
      eureka:
        client:
          fetch-registry: false #自己就是注册中心,负责维护服务,不需要去检索服务
          register-with-eureka: false #不向注册中心注册自己
      
    • 启动类配置@EnableEurekaService

      @SpringBootApplication
      // @EnableEurekaService:EurekaServer服务器端启动类,接受其它微服务注册进来
      @EnableEurekaServer
      public class WzxSpringCloudEurekaApplication {
      
      	public static void main(String[] args) {
      		SpringApplication.run(WzxSpringCloudEurekaApplication.class, args);
      	}
      }
      
    • 启动应用并在浏览器访问http://localhost:8761/
      在这里插入图片描述

  • 服务提供者

    • 在pom.xml文件中添加依赖

      <!--添加eureka,将服务提供者注册到eureka中-->
      <dependency>
      	<groupId>org.springframework.cloud</groupId>
      	<artifactId>spring-cloud-starter-eureka</artifactId>
      </dependency>
      <dependency>
      	<groupId>org.springframework.cloud</groupId>
      	<artifactId>spring-cloud-starter-config</artifactId>
      </dependency>
      
    • 在application.propreties文件中进行配置

      server.port=9000
      eureka.instance.hostname=localhost
      eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
      spring.application.name=wzx-spring-cloud-provider
      
    • 编写Controller,提供简单的REST服务

      /**
       * @author WangZX
       * @create 2018-09-28 0:48
       */
      @RestController
      @RequestMapping("/dept")
      public class DeptControllerProvider {
          @Autowired
          private DeptService deptService;
          @GetMapping("/findAll")
          public List<Dept> findAll() {
              List<Dept> depts = deptService.findAll();
              return depts;
          }
      }
      
    • 编写启动类,添加@EnableEurekaClient注解声明该应用是一个Eureka客户端

      @SpringBootApplication
      // 扫描Mapper接口
      @MapperScan("com.wzx.dao")
      // @EnableEurekaClient:声明该应用是一个Eureka客户端
      @EnableEurekaClient
      public class WzxSpringCloudProviderApplication {
      	public static void main(String[] args) {
      		SpringApplication.run(WzxSpringCloudProviderApplication.class, args);
      	}
      }
      
  • 服务消费者

    • 在pom.xml文件中引入依赖

      <!--添加eureka,将服务消费者注册到eureka中-->
      <dependency>
      	<groupId>org.springframework.cloud</groupId>
      	<artifactId>spring-cloud-starter-eureka</artifactId>
      </dependency>
      <dependency>
      	<groupId>org.springframework.cloud</groupId>
      	<artifactId>spring-cloud-starter-config</artifactId>
      </dependency>
      <!--客户端的负载均衡,轮询-->
      <dependency>
      	<groupId>org.springframework.cloud</groupId>
      	<artifactId>spring-cloud-starter-ribbon</artifactId>
      </dependency>
      
    • 在application.properties文件中进行配置

      #消费者端口
      server.port=80
      spring.application.name=wzx-spring-cloud-consumer
      eureka.instance.hostname=localhost
      eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
      
    • 配置RestTemplate
      RestTemplate是Spring提供的一种简单便捷访问Restful服务模板类,提供用于访问Rest服务的客户端模板类

      @Configuration
      public class RestTemplateConfig {
          /**
           * RestTemplate:提供了多种便捷访问远程Http服务的方法
           * 是一种简单便捷访问Restful服务模板类,提供用于访问Rest服务的客户端模板类
           */
          @Bean
          @LoadBalanced
          public RestTemplate restTemplate(){
              return new RestTemplate();
          }
      }
      
    • 编写Controller,通过服务名来调用服务

      /**
       * @author WangZX
       * @create 2018-09-27 14:54
       */
      @RestController
      @RequestMapping("/consumer/dept")
      public class DeptController {
          @Autowired
          private RestTemplate restTemplate;
          @GetMapping("findAll")
          public List<Dept> findAll() {
              //通过服务提供者名称调用
              List<Dept> depts = restTemplate.getForObject("http://wzx-spring-cloud-provider/dept/findAll", List.class);
              return depts;
          }
      }
      
  • 最终测试

    • 启动Eureka服务器
    • 启动服务提供者
    • 启动服务消费者
      在这里插入图片描述
      在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_27046951/article/details/82880609