Spring Cloud 探索 | 服务注册与发现 Eureka(下)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liupeifeng3514/article/details/85164816

上文 ……

注意:以下是针对Eureka Client进行配置,如果需要对Eureka Server进行配置会有明显的说明。

4 Spring Cloud Eureka Client 配置过程


4.1 pom.xml 添加依赖

添加Eureka Client依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

4.2 配置启动类

与往常 Spring Boot 启动类类似,不同的是多了一个 @EnableDiscoveryClient 注解,用来标识当前工程是Discovery Client。因为 Spring Cloud 提供了非常多的服务注册发现的组件,如 euerka、zookeeper、consul、etcd。所以为统一标识客户端身份,它用的是 @EnableDiscoveryClient 注解。

也可以使用@EnableEurekaClient,但是此注解只适用于 euerka 服务注册发现组件。

@SpringBootApplication
@EnableDiscoveryClient
public class SpringCloudEurekaClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringCloudEurekaClientApplication.class, args);
    }

}

4.3 application.yml基础配置

下面是一个Eureka客户端最基本的配置:

server:
  port: 9005
spring:
  application:
    name: service-provider
eureka:
  instance:
    hostname: eureka-client.com # 记得修改 hosts 文件
  client:
    service-url:
      defaultZone: http://lpf:root@eureka-server.com:9000/eureka
      #defaultZone: http://eureka-server.com:9000/eureka
logging.level.root: info

配置解释:

  • spring.application.name: 指定微服务的名称,后续在调用的时候只需要使用该名称就可以进行服务的访问;
  • eureka.client.service-url.defaultZone: 指定服务注册中心的位置。如果Eureka Server配置了权限验证,则配置格式如下:http://${security.user.name}:${security.user.password}@${eureka.instance.hostname}:${server.port}/eureka/

到此,Eureka Client已经可以和Eureka Server正常连接了。

4.4 Controller、Service等

在编写代码之前需要在 pom.xml 文件中添加需要的依赖:

<dependency>
   <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

在服务提供方中提供一个接口来获取当前所有的服务信息:

@RestController
public class ProviderController {

    //日志记录器
    Logger logger = LoggerFactory.getLogger(getClass());

    @Autowired
    DiscoveryClient discoveryClient;

    @GetMapping("/dept/simlpe/{id}")
    public String simlpe(@PathVariable("id") long id) {
        // 获取已注册到Eureka的实例信息
        String result = JSON.toJSONString(discoveryClient.getServices());
        logger.info(result);
        return "来自服务提供者:" + result;
    }
}

4.5 配置/测试/展示结果

4.5.1 访问 eureka

此时,启动Eureka Client,访问 eureka:
在这里插入图片描述
可以看到,服务已经注册成功了。

4.5.2 访问 /dept/simlpe/{id}

在这里插入图片描述
可以看到,Eureka Client成功的从Eureka Server获取了服务列表。

4.5.3 显示具体的服务实例

在 application.yml 文件中添加如下配置项:

eureka:
  instance:
    instance-id: eureka-client-9005

配置解释:

  • eureka.instance.instance-id: 用于标识此微服务实例。这里也可以使用这样的配置方式instance-id: ${spring.application.name}:${server.port}
    在这里插入图片描述
4.5.4 使用IP地址注册服务实例

在添加配置项之前服务注册信息如状态栏所示:此时是使用域名进行注册。
在这里插入图片描述
在 application.yml 文件中添加如下配置项:

eureka:
  instance:
    prefer-ip-address: true

如下图,此时是使用IP地址进行注册:
在这里插入图片描述

4.5.5 使用指定IP地址注册服务实例

在 application.yml 文件中添加如下配置项并设置 prefer-ip-address:=true:

eureka:
  instance:
    ip-address: 127.0.0.12

如下图,此时是使用我们指定的IP地址进行注册:
在这里插入图片描述

关于 prefer-ip-address 和 ip-address配置项的详细解释请参看这里1

4.5.6 查看服务实例的详细信息

在 pom.xml中添加依赖并添加一个信息匹配的插件:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>2.6</version>
            <configuration>
                <delimiters>
                    <delimiter>@</delimiter>
                </delimiters>
                <useDefaultDelimiters>false</useDefaultDelimiters>
            </configuration>
        </plugin>
    </plugins>
</build>

修改 application.yml 配置文件,追加 info 的相关信息:

info:
    build:
        artifact: @project.artifactId@
        name: @project.name@
        description: @project.description@
        version: @project.version@

添加完成后,通过Eureka Server页面查看相应服务实例的信息:
在这里插入图片描述
显示如图:
在这里插入图片描述

4.5.6 配置客户端心跳

Eureka Client之所以可以与 Eureka Server之间保持联系,依靠的是心跳机制,也就是说客户端可以自己来进行心跳的配置处理。在 application.yml 文件中添加如下配置项:

eureka:
  instance:
    lease-renewal-interval-in-seconds: 3
    lease-expiration-duration-in-seconds: 4

配置解释:

  • eureka.instance.lease-renewal-interval-in-seconds:设置心跳的时间间隔(默认是30秒);
  • eureka.instance.lease-expiration-duration-in-seconds:eureka服务器在接受到实例的最后一次发出的心跳后,需要等待多久才可以将此实例删除(默认是90秒)。
    如果该值太大,则很可能将流量转发过去的时候,该instance已经不存活了。
    如果该值设置太小了,则instance则很可能因为临时的网络抖动而被摘除掉。
    另外,该值至少应该大于lease-renewal-interval-in-seconds。

这里就不演示了,大家可以将日志级别调整为 debug,从日志就可以观察出来。

4.5.7 健康检查23

默认情况下,Eureka中各个服务实例的健康检查并不是通过spring-boot-actuator模块的 /health 端点来实现的,而是依靠客户端心跳的方式保持服务实例的存活,在Eureka的服务续约与剔除机制下,客户端的监控状态从注册到注册中心开始都会处于UP状态,除非心跳终止一段时间之后,服务注册中心将其剔除。默认的心跳实现方式可以有效检查客户端进程是否正常运作,但却无法保证客户端应用能够正常提供服务。由于大多数的应用都会有一些其他的外部资源依赖,比如数据库。缓存、消息代理等,如果应用与这些外部资源无法联通的时候,实际上已经不能提供正常的对外服务了,但此时心跳依然正常,所以它还是会被服务消费者调用,而这样的调用实际上并不能获得预期的结果。

在Spring Cloud Eureka中,我们可以通过简单的配置,把Eureka客户端的监控检查交给spring-boot-actuator模块的 /health 端点,以实现更加全面的健康状态维护。

在 application.yml 文件中添加如下配置项:

eureka.client.healthcheck.enabled: true
management.endpoint.health.show-details: always # 显示详细的健康检查信息

然后我们在项目中添加如下配置来验证一下此配置项:

// 自定义健康检查:用来控制服务器的健康状态
@Component
public class MyHealthChecker implements HealthIndicator {

    private boolean up = true;

    @Override
    public Health health() {
        if (up) {
            return Health.up().build();
        } else {
            return Health.down().build();
        }
    }

    public void setUp(boolean up) {
        this.up = up;
    }
}

在 ProviderController 中添加如下方法:

@RestController
public class ProviderController {

    @Autowired
    MyHealthChecker myHealthChecker;

    @RequestMapping("/up")
    public String up(@RequestParam("up") Boolean up) {
        myHealthChecker.setUp(up);
        return up.toString();
    }
}

重启Eureka Client后将会注册到Eureka Server中去,此时显示的是UP:
在这里插入图片描述
然后我们调用一下服务:http://127.0.0.1:9005/up?up=false ,此时查看 http://127.0.0.1:9005/actuator/health ,整个应用的 health 状态变成 DOWN 了:
在这里插入图片描述
注册中心的服务状态也将变为DOWN:
在这里插入图片描述
另外,我们可以试一下把 application.ym l中 eureka.client.healthcheck.enabled=true 这段配置去掉重新启动服务,然后调用服务将 health 变为 DOWN,但是注册中心中仍然会显示该服务的 status 为 UP!

4.5.8 修改状态页面和健康监控地址

在 application.yml 文件中添加如下配置项:

management.server.port: 8088
management.endpoints.web.base-path: /monitor

此时,Eureka Client注册信息如下图所示:
在这里插入图片描述
可以看到,注册信息不正确,点击实例访问 info 端点返回 404。问了解决这样的问题,我们添加如下配置项:

eureka.instance.status-page-url-path: ${management.endpoints.web.base-path}/info

此时,注册信息如下,可以正常访问:
在这里插入图片描述

5 附加补充


5.1 其他参数

Eureka Client 的其他参数:

spring:
  cloud:
    inetutils:
      # 忽略指定网卡(支持正则),假设你的电脑有 VM 那么该选项是非常有用的一个选项
      ignored-interfaces:
        #忽略 docker0 网卡以及 veth 开头的网卡
        - docker0
        - veth.*
      preferred-networks:
        # 使用指定网络地址,选择 eth0 网卡,当然也可以直接写 IP (192.168)
        - eth0
        - 192.168

eureka:
  # 客户端进行Eureka注册的配置
  client:
    # 是否从eureka服务器上获取注册信息,默认为true
    fetch-registry: true
    # 当前的微服务是否注册到eureka之中,默认为true
    register-with-eureka: true
    # 从eureka服务器端获取注册信息的间隔时间(默认:30秒)
    registry-fetch-interval-seconds: 5

5.2 其他功能介绍

暂无

5.3 遗留问题

暂无

5.3 源码地址

源码:https://gitee.com/liupeifeng3514/Spring-Cloud-Learning


  1. Eureka服务注册过程详解之IpAddress(详解eureka.instance.prefer-ip-address = true 与 eureka.instance.prefer-ip-address) ↩︎

  2. eureka.client.healthcheck.enabled=true改变eureka server中注册的服务的健康检测方式 ↩︎

  3. Eureka服务实例类配置 ↩︎

猜你喜欢

转载自blog.csdn.net/liupeifeng3514/article/details/85164816