高可用的服务注册中心-Eureka集群

Eureka集群框架图
在微服务架构这样的分布式环境中,我们要充分考虑到可能发生故障的情况,所以需要进行高可用的部署。

  • 两个Eureka Server、两个服务提供者和一个服务调用者
    高可用的服务注册中心-Eureka集群_第1张图片

工程结构
高可用的服务注册中心-Eureka集群_第2张图片

  • 修改C:\Windows\System32\drivers\etc\HOSTS文件
    因为只要一台机器,要构建集群,需要修改HOSTS文件,添加主机名映射
    # eureka服务器配置
    127.0.0.1 eureka-server1
    127.0.0.1 eureka-server2
    
  • Eureka服务器
    • 在pom.xml文件中添加依赖

      
      <dependency>
      	<groupId>org.springframework.cloudgroupId>
      	<artifactId>spring-cloud-starter-eureka-serverartifactId>
      dependency>
      
    • 在application.yml文件中进行配置
      yml直接多文档块

      #配置服务端口
      server:
        port: 8761
      eureka:
        instance:
          hostname: eureka-server1
        client:
          service-url:
            defaultZone: Http://eureka-server2:8762/eureka/
      spring:
        profiles: eureka-server1
      ---
      #配置服务端口
      server:
        port: 8762
      eureka:
        instance:
          hostname: eureka-server2
        client:
            service-url:
              defaultZone: Http://eureka-server1:8761/eureka/
      spring:
        profiles: eureka-server2
      
      
    • 启动类配置@EnableEurekaService

      @SpringBootApplication
      // @EnableEurekaService:EurekaServer服务器端启动类,接受其它微服务注册进来
      @EnableEurekaServer
      public class WzxSpringCloudEurekaApplication {
      
      	public static void main(String[] args) {
      		SpringApplication.run(WzxSpringCloudEurekaApplication.class, args);
      	}
      }
      
    • 使用Maven 将项目打成jar包
      高可用的服务注册中心-Eureka集群_第3张图片

  • 在命令行通过spring.profiles.active属性分别启动eureka-server1和eureka-server2
    java -jar wzx-spring-cloud-eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=eureka-server1
    java -jar wzx-spring-cloud-eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=eureka-server2
    
  • 访问http://eureka-server1:8761/和http://eureka-server2:8762/
    可以看到两个Eureka Server已经相互注册
    高可用的服务注册中心-Eureka集群_第4张图片
    高可用的服务注册中心-Eureka集群_第5张图片
  • 服务提供者
    • 在pom.xml文件中引入依赖

      
      <dependency>
      	<groupId>org.springframework.cloudgroupId>
      	<artifactId>spring-cloud-starter-eurekaartifactId>
      dependency>
      <dependency>
      	<groupId>org.springframework.cloudgroupId>
      	<artifactId>spring-cloud-starter-configartifactId>
      dependency> 
      
    • 在application.propreties文件中进行配置
      将服务提供者注册到两个Eureka Server中去

      server.port=9000
      eureka.instance.hostname=localhost
      eureka.client.service-url.defaultZone=http://eureka-server1:8761/eureka/,http://eureka-server1:8762/eureka/
      spring.application.name=wzx-spring-cloud-provider
      
    • 编写启动类,添加@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);
      	}
      }
      
    • 编写Controller,提供简单的REST服务

      @RestController
      @RequestMapping("/dept")
      public class DeptControllerProvider {
          @GetMapping("/findDept")
          public Dept findDept(HttpServletRequest request) {
              Dept dept = new Dept();
              dept.setDeptno(1L);
              dept.setDname("开发部");
              // 将请求地址封装进参数中来测试负载均衡
              dept.setDb_source(request.getRequestURL().toString());
              return dept;
          }
      }
      
    • 通过java jar命令行的方式启动两个不同端口的服务提供者

      java -jar wzx-spring-cloud-provider-0.0.1-SNAPSHOT.jar --server.port=9000
      java -jar wzx-spring-cloud-provider-0.0.1-SNAPSHOT.jar --server.port=9001
      
  • 服务消费者
    • 在pom.xml文件中添加依赖
      服务消费者端多引入一个ribbon依赖进行负载均衡

      
      <dependency>
      	<groupId>org.springframework.cloudgroupId>
      	<artifactId>spring-cloud-starter-eurekaartifactId>
      dependency>
      <dependency>
      	<groupId>org.springframework.cloudgroupId>
      	<artifactId>spring-cloud-starter-configartifactId>
      dependency>
      
      <dependency>
      	<groupId>org.springframework.cloudgroupId>
      	<artifactId>spring-cloud-starter-ribbonartifactId>
      dependency>
      
    • 在application.xml文件进行配置

      #消费者端口
      server.port=80
      spring.application.name=wzx-spring-cloud-consumer
      eureka.instance.hostname=localhost
      eureka.client.service-url.defaultZone=http://eureka-server1:8761/eureka/,http://eureka-server2:8762/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("findDept")
          public Dept findDept() {
              //通过服务提供者名称调用
              Dept dept = restTemplate.getForObject("http://wzx-spring-cloud-provider/dept/findDept", Dept.class);
              return dept;
          }
      }
      
  • 使用HttpClient进行测试
    HttpClient是Apache提供的一个Http工具包
    • 在pom.xml引入HttpClient依赖

      
      <dependency>
      	<groupId>org.apache.httpcomponentsgroupId>
      	<artifactId>httpclientartifactId>
      	<version>4.4version>
      dependency>
      
    • 编写测试程序TestHttpClient

      /**
       * @author WangZX
       * @create 2018-09-28 19:18
       */
      public class TestHttpClient {
          public static void main(String[] args) throws IOException {
              // 创建客户端
              CloseableHttpClient client = HttpClients.createDefault();
              // 创建HttpGet对象
              HttpGet httpGet = new HttpGet("Http://localhost/consumer/dept/findDept");
              // 多次请求,测试负载均衡
              for (int i = 0;i < 6;i++){
                  // 执行Get请求
                  HttpResponse response = client.execute(httpGet);
                  // 解析响应
                  System.out.println(EntityUtils.toString(response.getEntity()));
              }
          }
      }
      
    • 通过java jar启动两个Eureka 服务器

    • 通过java jar启动两个端口不同的服务提供者

    • 启动消费者
      高可用的服务注册中心-Eureka集群_第6张图片
      高可用的服务注册中心-Eureka集群_第7张图片

  • 测试结果展示
    高可用的服务注册中心-Eureka集群_第8张图片
    可以看到9000和9001端口的服务提供者被轮询调用!

你可能感兴趣的:(SpringCloud)