Spring cloud搭建Eureka高可用注册中心

注册中心在微服务中是必不可少的一部分,主要用来实现服务自治的功能,本文则主要记载使用Netflix提供的Eureka作为注册中心,来实现服务自治的功能。

实际上Eureka的集群搭建方法很简单:每一台Eureka只需要在配置中指定另外多个Eureke的地址,就可以实现一个集群的搭建了

例如:

两节点

  -- 节点1注册到节点2

  --节点2注册到节点1

三节点

  --节点1注册到节点2,3

  --节点2注册到节点1,3

  --节点3注册到节点1,2

我做的是两个Eureka节点构建注册中心,然后一个producer和一个customer分别进行提供服务和请求服务:见图

 

 

 

节点1:

先新建一个Maven项目,添加依赖(基于jdk11,如果不是jdk11,可以不添加)

pom.xml主要代码

 1 <parent>
 2         <groupId>org.springframework.boot</groupId>
 3         <artifactId>spring-boot-starter-parent</artifactId>
 4         <version>1.5.4.RELEASE</version>
 5         <relativePath/>
 6     </parent>
 7 
 8     <properties>
 9         <java.version>11</java.version>
10     </properties>
11 
12     <!-- 依赖 -->
13     <dependencies>
14         <!-- Eureka -->
15         <dependency>
16             <groupId>org.springframework.cloud</groupId>
17             <artifactId>spring-cloud-starter-eureka-server</artifactId>
18         </dependency>
19 
20         <!--java 11 缺少的模块 javax.xml.bind-->
21         <dependency>
22             <groupId>javax.xml.bind</groupId>
23             <artifactId>jaxb-api</artifactId>
24             <version>2.3.0</version>
25         </dependency>
26         <dependency>
27             <groupId>com.sun.xml.bind</groupId>
28             <artifactId>jaxb-impl</artifactId>
29             <version>2.3.0</version>
30         </dependency>
31         <dependency>
32             <groupId>org.glassfish.jaxb</groupId>
33             <artifactId>jaxb-runtime</artifactId>
34             <version>2.3.0</version>
35         </dependency>
36         <dependency>
37             <groupId>javax.activation</groupId>
38             <artifactId>activation</artifactId>
39             <version>1.1.1</version>
40         </dependency>
41 
42         <!-- 添加 Spring-Security 不需要则不添加-->
43         <dependency>
44             <groupId>org.springframework.boot</groupId>
45             <artifactId>spring-boot-starter-security</artifactId>
46         </dependency>
47     </dependencies>
48 
49     <!-- Spring Cloud -->
50     <dependencyManagement>
51         <dependencies>
52             <dependency>
53                 <groupId>org.springframework.cloud</groupId>
54                 <artifactId>spring-cloud-dependencies</artifactId>
55                 <version>Dalston.SR4</version>
56                 <type>pom</type>
57                 <scope>import</scope>
58             </dependency>
59         </dependencies>
60     </dependencyManagement>

application.yml

---
server:
  ###启动端口
  port: 8761
spring:
  ###启动的配置文件名
  profiles: eureka1
  ###应用名
  application:
    name: master
eureka:
  instance:
    hostname: eureka1
  client:
    ###不向注册中心注册自己
    register-with-eureka: false
    ###不需要检索服务
    fetch-registry: false
    serviceUrl:
      defaultZone: http://127.0.0.1:8762/eureka/
  server:
    ###关闭自我保护模式
    enable-self-preservation: false
    ###清理的间隔为5s
    eviction-interval-timer-in-ms: 5000
security:
  basic:
    ###暂时关闭安全认证
    enabled: false

---
server:
  ###启动端口
  port: 8762
spring:
  ###启动的配置文件名
  profiles: eureka2
  application:
    ###应用名
    name: slaveone
eureka:
  instance:
    hostname: eureka2
  client:
    ###不向注册中心注册自己
    register-with-eureka: false
    ###不需要检索服务
    fetch-registry: false
    serviceUrl:
      defaultZone: http://127.0.0.1:8761/eureka/
  server:
    ###关闭自我保护模式
    enable-self-preservation: false
    ###清理的间隔为5s
    eviction-interval-timer-in-ms: 5000
security:
  basic:
    ###暂时关闭安全认证
    enabled: false

启动类:EurekaServerApplication.class

1 @EnableEurekaServer
2 @SpringBootApplication
3 public class EurekaServerApplication {
4 
5     public static void main(String [] args){
6         SpringApplication.run(EurekaServerApplication.class, args);
7     }
8 }

启动参数 IDEA设置    --spring.profiles.active=eureka1

点击这个:

 

同理另外一个节点的启动类,application.yml和pom.xml文件与节点1相同

启动参数改为--spring.profiles.active=eureka2

 

此时,浏览器输入 http://127.0.0.1:8761/发现如下:

 

至此注册中心已经搭建完成

producer服务注册:

主要的pom.xml文件

 1     <properties>
 2         <java.version>11</java.version>
 3     </properties>
 4 
 5     <parent>
 6         <groupId>org.springframework.boot</groupId>
 7         <artifactId>spring-boot-starter-parent</artifactId>
 8         <version>1.5.4.RELEASE</version>
 9         <relativePath/>
10     </parent>
11 
12     <!-- 依赖 -->
13     <dependencies>
14         <!-- Eureka -->
15         <dependency>
16             <groupId>org.springframework.cloud</groupId>
17             <artifactId>spring-cloud-starter-eureka</artifactId>
18         </dependency>
19         <!--java 11 缺少的模块 javax.xml.bind-->
20         <dependency>
21             <groupId>javax.xml.bind</groupId>
22             <artifactId>jaxb-api</artifactId>
23             <version>2.3.0</version>
24         </dependency>
25         <dependency>
26             <groupId>com.sun.xml.bind</groupId>
27             <artifactId>jaxb-impl</artifactId>
28             <version>2.3.0</version>
29         </dependency>
30         <dependency>
31             <groupId>org.glassfish.jaxb</groupId>
32             <artifactId>jaxb-runtime</artifactId>
33             <version>2.3.0</version>
34         </dependency>
35         <dependency>
36             <groupId>javax.activation</groupId>
37             <artifactId>activation</artifactId>
38             <version>1.1.1</version>
39         </dependency>
40 
41         <!-- Actuator 健康检查 -->
42         <dependency>
43             <groupId>org.springframework.boot</groupId>
44             <artifactId>spring-boot-starter-actuator</artifactId>
45         </dependency>
46     </dependencies>
47 
48     <!-- Spring Cloud -->
49     <dependencyManagement>
50         <dependencies>
51             <dependency>
52                 <groupId>org.springframework.cloud</groupId>
53                 <artifactId>spring-cloud-dependencies</artifactId>
54                 <version>Dalston.SR4</version>
55                 <type>pom</type>
56                 <scope>import</scope>
57             </dependency>
58         </dependencies>
59     </dependencyManagement>

application.properties文件:

spring.application.name=producer
server.port=8081
eureka.client.service-url.defaultZone=http://127.0.0.1:8761/eureka/,http://127.0.0.1:8762/eureka/

### 配置健康检查的信息
eureka.client.healthcheck.enabled=true
### 默认30s
eureka.instance.lease-renewal-interval-in-seconds=5
### 默认90秒
eureka.instance.lease-expiration-duration-in-seconds=5
1 @RestController
2 @RequestMapping("/home")
3 public class HomeController {
4 
5     @GetMapping("/hello")
6     public String hello(){
7         return "hello";
8     }
9 }

 基本的control类和启动类

1 @SpringBootApplication
2 @EnableDiscoveryClient
3 public class ProduceServiceApplication {
4     public static void main(String[] args){
5         SpringApplication.run(ProduceServiceApplication.class, args);
6     }
7 }

启动之后再看Eureka注册中心:两个节点应该都有

访问   http:127.0.0.1:8081/home/hello  发现正常返回字符串

此时

搭建customer请求服务

pom.xml 和application.properties文件

<properties>
        <java.version>11</java.version>
    </properties>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.4.RELEASE</version>
        <relativePath/>
    </parent>

    <!-- 依赖 -->
    <dependencies>
        <!-- Eureka -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <!--java 11 缺少的模块 javax.xml.bind-->
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jaxb</groupId>
            <artifactId>jaxb-runtime</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>activation</artifactId>
            <version>1.1.1</version>
        </dependency>

        <!-- Actuator 健康检查 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    </dependencies>

    <!-- Spring Cloud -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Dalston.SR4</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
spring.application.name=customer
server.port=8082
eureka.client.service-url.defaultZone=http://127.0.0.1:8761/eureka/,http://127.0.0.1:8762/eureka/

### 配置健康检查的信息
eureka.client.healthcheck.enabled=true
### 默认30s
eureka.instance.lease-renewal-interval-in-seconds=5
### 默认90秒
eureka.instance.lease-expiration-duration-in-seconds=5

获取RestTemplate的类:

1 @Configuration
2 public class BeanConfiguration {
3 
4     @Bean
5     @LoadBalanced
6     public RestTemplate getRestTemplate(){
7         return new RestTemplate();
8     }
9 }

control类

 1 @RestController
 2 @RequestMapping("/customer/")
 3 public class CustomerServiceController {
 4 
 5     @Autowired
 6     private RestTemplate restTemplate;
 7 
 8     @GetMapping("/callHello")
 9     public String callHello(){
10         return restTemplate.getForObject("http://producer/home/hello", String.class);
11     }
12 }

启动类:

1 @SpringBootApplication
2 @EnableDiscoveryClient
3 public class CustomerMainApplication {
4     public static void main(String[] args){
5         SpringApplication.run(CustomerMainApplication.class, args);
6     }
7 }

 

首先,正常情况下访问   http://localhost:8082/customer/callHello

 

 

然后停掉节点1,继续访问看是否成功:

请求正常

 

重新启动节点1,查看节点2的日志:

节点2在丢失节点1之后会不断重试

直到找到节点1,高可用重新生成

 

如果有什么错误或者纰漏,恳请指正,谢谢

 

posted @ 2019-07-24 10:11  ITyun  阅读(368)  评论(0编辑  收藏  举报