Eureka注册中心

1.1 RestTemplate 的配置

首先改造 RestTemplate 的配置,添加一个 @LoadBalanced 注解,这个注解会自动构造 LoadBalancerClient 接口的实现类并注册到 Spring 容器中,代码如下所示。

@Configuration
public class BeanConfiguration {
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}

接下来就是改造调用代码,我们不再直接写固定地址,而是写成服务的名称,这个名称就是我们注册到 Eureka 中的名称,是属性文件中的 spring.application.name,相关代码如下所示。

@RestController
public class ArticleController {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/article/callHello2")
    public String callHello2() {

    return restTemplate.getForObject("http://eureka-client-user-service/user/hello", String.class);
}
}

1.2 Eureka注册中心开启密码认证

Eureka 自带了一个 Web 的管理页面,方便我们查询注册到上面的实例信息,但是有一个问题:如果在实际使用中,注册中心地址有公网 IP 的话,必然能直接访问到,这样是不安全的。所以我们需要对 Eureka 进行改造,加上权限认证来保证安全性。
在Eureka服务中,通过集成 Spring-Security 来进行安全认证。
在 pom.xml 中添加 Spring-Security 的依赖包,代码如下所示。

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

然后在application.yml中加上认证的配置信息:

spring:
  security:
    #设置安全认证
    user:
      name: sa
      password: 123123

增加 Security 配置类:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // 关闭csrf
        http.csrf().disable();
        // 支持httpBasic
        http.authorizeRequests().anyRequest().authenticated().and().httpBasic();
    }
}

在 Eureka 开启认证后,客户端注册的配置也要加上认证的用户名和密码信息:

eureka.client.serviceUrl.defaultZone=http://zhangsan:123456@localhost:8761/eureka/

1.3 Eureka集群搭建

搭建步骤:
1.eureka-server-cluster,配置跟 eureka-server 一样。
2.pom.xml文件引入:

<dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-netflix-eureka-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.SR2</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

3.applicationl.yml文件配置:

server:
  port: 9000
spring:
  application:
    name: eureka-server-cluster
  security:
    user:
      name: admin
      password: admin
      ## 指定不同的环境
  #profiles: master
eureka:
  instance:
    hostname: localhost
  client:
      # 由于该应用为注册中心, 所以设置为false, 代表不向注册中心注册自己
    register-with-eureka: false
     # 由于注册中心的职责就是维护服务实例, 它并不需要去检索服务, 所以也设置为 false
    fetch-registry: false
    service-url:
      defaultZone: http://admin:admin@localhost:8080/eureka/
  1. eureka-server application.yml的配置文件
server:
  port: 8080
spring:
  application:
    name: eureka-server
  security:
    #设置安全认证
    user:
      name: admin
      password: admin
eureka:
  instance:
    hostname: localhost
  client:
    # 由于注册中心的职责就是维护服务实例, 它并不需要去检索服务, 所以也设置为 false
    fetch-registry: false
    # 由于该应用为注册中心, 所以设置为false, 代表不向注册中心注册自己
    register-with-eureka: false
    service-url:
      defaultZone: http://admin:admin@localhost:9000/eureka/

之前在客户端中我们通过配置 eureka.client.serviceUrl.defaultZone 来指定对应的注册中心,当我们的注册中心有多个节点后,就需要修改 eureka.client.serviceUrl.defaultZone 的配置为多个节点的地址,多个地址用英文逗号隔开即可:

eureka:
  instance:
    hostname: localhost
    # 定义实例ID格式
    instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${server.port}
  client:
    service-url:
      defaultZone: http://admin:admin@localhost:8080/eureka/,http://admin:admin@localhost:9000/eureka/
    instance:
      prefer-ip-address: true #使用IP地址注册

1.4 关闭自我保护

保护模式主要在一组客户端和 Eureka Server 之间存在网络分区场景时使用。一旦进入保护模式,Eureka Server 将会尝试保护其服务的注册表中的信息,不再删除服务注册表中的数据。当网络故障恢复后,该 Eureka Server 节点会自动退出保护模式。
如果在 Eureka 的 Web 控制台看到图 1 所示的内容,就证明 Eureka Server 进入保护模式了。
image
可以通过下面的配置将自我保护模式关闭,这个配置是在 eureka-server 中:

eureka.server.enableSelfPreservation=false

1.5 自定义 Eureka 的 InstanceID

客户端在注册时,服务的 Instance ID 的默认值的格式如下:

${spring.cloud.client.hostname}:${spring.application.name}:${spring.application. instance_id:${server.port}}

翻译过来就是“主机名:服务名称:服务端口”。当我们在 Eureka 的 Web 控制台查看服务注册信息的时候,就是这样的一个格式:

ser-PC:eureka-client-user-service:8081

多时候我们想把 IP 显示在上述格式中,此时,只要把主机名替换成 IP 就可以了,或者调整顺序也可以。可以改成下面的样子,用“服务名称:服务所在 IP:服务端口”的格式来定义:

eureka.instance.instance-id=${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}

1.6 自定义实例跳转链接

eureka:
        instance:
          hostname: localhost
          # 定义实例ID格式
          instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${server.port}
          #自定义实例跳转链接
          status-page-url: http://localhost:${server.port}//user/hello
        client:
          service-url:
            defaultZone: http://admin:admin@localhost:8080/eureka/,http://admin:admin@localhost:9000/eureka/
          instance:
            prefer-ip-address: true #使用IP地址注册

1.7 Eureka开发时快速移除失效服务

在实际开发过程中,我们可能会不停地重启服务,由于 Eureka 有自己的保护机制,故节点下线后,服务信息还会一直存在于 Eureka 中。我们可以通过增加一些配置让移除的速度更快一点,当然只在开发环境下使用,生产环境下不推荐使用。
首先在我们的 eureka-server 中增加两个配置,分别是关闭自我保护和清理间隔:

eureka.server.enable-self-preservation=false
# 默认 60000 毫秒
eureka.server.eviction-interval-timer-in-ms=5000

然后在具体的客户端服务中配置下面的内容:

eureka.client.healthcheck.enabled=true
# 默认 30 秒
eureka.instance.lease-renewal-interval-in-seconds=5
# 默认 90 秒
eureka.instance.lease-expiration-duration-in-seconds=5

eureka.client.healthcheck.enabled 用于开启健康检查,需要在 pom.xml 中引入 actuator 的依赖,代码如下所示。

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

其中:

  • eureka.instance.lease-renewal-interval-in-seconds 表示 Eureka Client 发送心跳给 server 端的频率。
  • eureka.instance.lease-expiration-duration-in-seconds 表示 Eureka Server 至上一次收到 client 的心跳之后,等待下一次心跳的超时时间,在这个时间内若没收到下一次心跳,则移除该 Instance。

更多的 Instance 配置信息可参考源码中的配置类:org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean。

更多的 Server 配置信息可参考源码中的配置类:org.springframework.cloud.netflix.eureka.server.EurekaServerConfigBean。

1.8 Eureka REST API

appID是应用程序的名称,instanceID是与实例关联的唯一id。在AWS云中,instanceID是实例的实例id,在其他数据中心中,instanceID是实例的主机名。
image

image

下面举例说明如何获取 Eureka 中注册的信息。具体的接口信息请查看官方文档“https://github.com/Netflix/eureka/wiki/Eureka-REST-operations“。
获取某个服务的注册信息,可以直接 GET 请求:http://localhost:8080/eureka/apps/
查询某个服务的实例列表:http://localhost:8080/eureka/apps/EUREKA-PRODUCT/
查询的xml如下:
image

参考地址:https://blog.csdn.net/wo18237095579/article/details/83271829

1.8.1 元数据使用

Eureka 的元数据有两种类型,分别是框架定好了的标准元数据和用户自定义元数据。标准元数据指的是主机名、IP 地址、端口号、状态页和健康检查等信息,这些信息都会被发布在服务注册表中,用于服务之间的调用。自定义元数据可以使用 eureka.instance.metadataMap 进行配置。

自定义元数据说得通俗点就是自定义配置,我们可以为每个 Eureka Client 定义一些属于自己的配置,这个配置不会影响 Eureka 的功能。

自定义元数据可以用来做一些扩展信息,比如灰度发布之类的功能,可以用元数据来存储灰度发布的状态数据,Ribbon 转发的时候就可以根据服务的元数据来做一些处理。当不需要灰度发布的时候可以调用 Eureka 提供的 REST API 将元数据清除掉。

下面我们来自定义一个简单的元数据,在属性文件中配置如下:

eureka:
  instance:
  metadata-map:
         name: wenjun

image

1.8.2 EurekaClient 使用

当我们的项目中集成了 Eureka 之后,可以通过 EurekaClient 来获取一些我们想要的数据,比如刚刚上面讲的元数据。我们就可以直接通过 EurekaClient 来获取(代码如下所示),不用再去调用 Eureka 提供的 REST API。

@Autowired
private EurekaClient eurekaClient;
@GetMapping("/article/infos")
public Object serviceUrl() {
    return eurekaClient.getInstancesByVipAddress( "eureka-client-user-service", false);
}

除了使用 EurekaClient,还可以使用 DiscoveryClient(代码如下所示),这个不是 Feign 自带的,是 Spring Cloud 重新封装的,类的路径为 org.springframework.cloud.client.discovery.DiscoveryClient。

@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("/article/infos")
public Object serviceUrl() {
    return discoveryClient.getInstances("eureka-client-user-service");
}
1.8.3 健康检查

在这种情况下,我们希望可以将健康信息传递给 Eureka 服务端。这样 Eureka 中就能及时将应用的实例信息下线,隔离正常请求,防止出错。通过配置如下内容开启健康检查:

eureka.client.healthcheck.enabled=true
1.8.4 服务上下线监控

在某些特定的需求下,我们需要对服务的上下线进行监控,上线或下线都进行邮件通知,Eureka 中提供了事件监听的方式来扩展。

前支持的事件如下:

  • EurekaInstanceCanceledEvent 服务下线事件。
  • EurekaInstanceRegisteredEvent 服务注册事件。
  • EurekaInstanceRenewedEvent 服务续约事件。
  • EurekaRegistryAvailableEvent Eureka 注册中心启动事件。
  • EurekaServerStartedEvent Eureka Server 启动事件。
posted @ 2021-06-16 19:28  风飘落叶  阅读(123)  评论(0编辑  收藏  举报