Eureka 集群部署

Eureka 集群

介绍 注册中心Eureka

又称服务中心,管理各种服务功能包括服务的注册、发现、熔断、负载、降级等。

任何一个服务都不能直接去掉用,都需要通过注册中心来调用。通过服务中心来获取服务你不需要关注你调用的项目IP地址,由几台服务器组成,每次直接去服务中心获取可以使用的服务去调用既可。

由于各种服务都注册到了服务中心,就有了很多高级功能条件。比如几台服务提供相同服务来做客户端负载均衡(Ribbon);监控服务器调用成功率来做断路器(Hystrix),移除服务列表中的故障点;监控服务调用时间来对不同的服务器设置不同的权重、智能路有(Zuul)等等。

Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务注册和发现。Eureka 采用了 C-S 的设计架构。Eureka Server 作为服务注册功能的服务器,它是服务注册中心。而系统中的其他微服务,使用 Eureka 的客户端连接到 Eureka Server,并维持心跳连接。这样系统的维护人员就可以通过 Eureka Server 来监控系统中各个微服务是否正常运行。Spring Cloud 的一些其他模块(比如Zuul)就可以通过 Eureka Server 来发现系统中的其他微服务,并执行相关的逻辑。

Eureka由两个组件组成:Eureka服务器和Eureka客户端。Eureka服务器用作服务注册服务器。Eureka客户端是一个java客户端,用来简化与服务器的交互、作为轮询负载均衡器,并提供服务的故障切换支持。Netflix在其生产环境中使用的是另外的客户端,它提供基于流量、资源利用率以及出错状态的加权负载均衡

Eureka 集群部署_第1张图片

1、Eureka Server

  • Eureka Server 作为一个独立的部署单元,以 REST API 的形式为服务实例提供了注册、管理和查询等操作。同时,Eureka Server 也为我们提供了可视化的监控页面,可以直观地看到各个 Eureka Server 当前的运行状态和所有已注册服务的情况。

2、Service Provider

  • 服务提供方
  • 将自身服务注册到Eureka,从而使服务消费方能够找到

3、Service Consumer

  • 服务消费方
  • 从Eureka获取注册服务列表,从而能够消费服务

Eureka集群部署

  1. 新建一个maven工程,pom如下

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.2.7.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>ink.pog</groupId>
        <artifactId>eurekaserver</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <description>Demo project for Spring cloud</description>
            
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
            </dependency>
        </dependencies>
    
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>Hoxton.SR4</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    </project>
    
    
  2. 配置yml

    server:
      # 设置端口号
      port: 7001
    spring:
      application:
        name: eurekaserver
    eureka:
      instance:
    	# 单机hostname为localhost
        hostname: eureka7001.com
        # 如果启用了ip注册地址,那么篡改了hosts文件也没用,会让hostname无效,显示的ip地址
        prefer-ip-address: false
      client:
    	# 是否从Eureka Server获取注册信息
        fetch-registry: true
        # 是否将自己注册到Eureka Server 
    	# 因为这里是集群所以需要将自己注册到Eureka Server,单机则不需要
        register-with-eureka: true
        service-url:
    	  # 配置其他集群的地址进行相互注册
          defaultZone: 	http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
    
    

    由于是集群,以及配置了hostname和http://eureka7002.com的写法,所以需要我们去hosts进行配置

    hosts文件的位置在: C:\Windows\System32\drivers\etc

    127.0.0.1 eureka7003.com
    127.0.0.1 eureka7002.com
    127.0.0.1 eureka7001.com
    
  3. 开启对Eureka Server的支持

    @SpringBootApplication
    @EnableEurekaServer
    public class EurekaserverApplication {
        public static void main(String[] args) {
            SpringApplication.run(EurekaserverApplication.class, args);
        }
    }
    

剩下的两个服务中心也是这样配置,就不贴了

提供者配置

  1. 创建一个maven工程,pom跟集群部署的pom类似,只不过要添加数据库之类的东西,这样就不贴了

  2. 配置yml文件

    server:
      port: 8001
    spring:
      application:
    	# 这个实例名很重要,这在以后的消费者与提供者之间相互调用一般都是根据这个name	
        name: producter
      datasource:
        url: jdbc:mysql://localhost/crud?useUnicode=true&characterEncoding=utf-8
        username: root
        password: root
        driver-class-name: com.mysql.jdbc.Driver
    
    mybatis:
      mapper-locations: classpath:mapper/*.xml
      configuration:
        map-underscore-to-camel-case: true
    eureka:
      instance:
        instance-id: springcloud-eureka-producter
        prefer-ip-address: true
      client:
      	fetch-registry: true
      	# 向服务中心注册自己
        register-with-eureka: true
        service-url:
          # 因为是集群部署,所以需要向所有的集群注册自己
          defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7003.com:7003/eureka/,http://eureka7002.com:7002/eureka/
        
    
  3. 写提供的方法

    @RestController
    public class EmplyeeController {
    
        @Autowired
        private EmplyeeService emplyeeServiceImpl;
    
        @GetMapping("/empl/get/{id}")
        public Emplyee get(@PathVariable("id")int id){
            return emplyeeServiceImpl.get(id);
        }
    
        @GetMapping("/empl/get")
        public List<Emplyee> getAll(){
            return emplyeeServiceImpl.getAll();
        }
    }
    
  4. 开启Eureka client

    @SpringBootApplication
    @EnableEurekaClient
    public class Producter8001Application {
        public static void main(String[] args) {
            SpringApplication.run(Producter8001Application.class, args);
        }
    }
    

这样一个提供者的服务就配置好,下面贴一个提供者项目的结构
Eureka 集群部署_第2张图片

消费者部署

  1. 创建maven工程,配置pom

  2. 配置yml

    eureka:
      instance:
        instance-id: consumer80
      client:
        register-with-eureka: true
        service-url:
          defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
        fetch-registry: true
    
  3. 因为是基本RestFul风格,所以需要配置一下RestTemplate以及负载均衡LoadBalanced

    @Configuration
    public class config {
        @Bean
        @LoadBalanced
        public RestTemplate restTemplate(){
            return new RestTemplate();
        }
    }
    
  4. 写消费者方法

    @RestController
    public class EmplyeeConsumer {
    
        @Autowired
        private DiscoveryClient client; # 获取服务信息类
        
        @Autowired
        private RestTemplate restTemplate; 
        # 这里的前缀就是刚才配置提供者的实例名字,spring.application.name
        private static final String REST_URL_PREFIX = "http://PRODUCTER";
        
        @GetMapping("/empl/get/{id}")
        public Emplyee get(@PathVariable("id")int id){
           return restTemplate.getForObject(REST_URL_PREFIX+"/empl/get",Emplyee.class);
        }
        
        @GetMapping("/empl/get")
        public List<Emplyee> getAll(){
            return restTemplate.getForObject(REST_URL_PREFIX + "/empl/get",List.class);
        }
        
        # 获取微服务的信息
        @GetMapping("/info")
        public List<ServiceInstance> info(){
            List<ServiceInstance> eurekaserver = client.getInstances("EUREKASERVER");
            return eurekaserver;
        }
    }
    
    

运行集群

至此,一个集群的配置就好了,接下运行一下试试,首先启动服务中心

Eureka 集群部署_第3张图片

然后接着启动提供者以及消费者,访问即可

在这里插入图片描述

你可能感兴趣的:(spring,spring,分布式)