Spring Cloud(四)Eureka

为Eureka Server添加用户认证

Eureka Server是允许匿名访问的,下面我们来构建一个需要登录才能访问的Eureka Server。
1:新建Spring Boot项目Eureka4,添加依赖Eureka Server、Security
2:启动类

@EnableEurekaServer
@SpringBootApplication
public class Eureka4Application {

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

3:配置文件application.yml

security:
  basic:
    enabled: true               # 开启基于HTTP basic的认证
  user:
    name: user                  # 配置登录的账号是user
    password: password123       # 配置登录的密码是password123
server:
  port: 8761                    # 指定该Eureka实例的端口
eureka:
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

4:运行测试
访问:http://localhost:8761/
这里写图片描述

将微服务注册到需认证的Eureka Server

如何才能将微服务注册到需认证的Eureka Server上呢?答案非常简单,只需将eureka.client.serviceUrl.defaultZone配置为http://user:password@EUREKA_HOST:EUREKA_PORT/eureka/这种形式,就可以将HTTP basic认证添加到Eureka Client了。

eureka:
  client:   
    serviceUrl:
      defaultZone: http://user:password123@localhost:8761/eureka/

Eureka 的元数据

Eureka 的元数据有两种,分为标准元数据和自定义元数据。
标准元数据指的是主机名、IP地址、端口号、状态页和健康检查等信息,这些信息都会被发布在服务注册表中,用于服务之间的调用。自定义元数据可以使用eureka.instance.metadata-map配置,这些元数据可以在远程客户端中访问,但一般不会改变客户端的行为;
1:新建Spring Boot项目Eureka,添加依赖Eureka Server
2:启动类

@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {

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

3:配置文件application.yml

server:
  port: 8761                  
eureka:
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

4:新建Spring Boot项目Eureka2,添加依赖Eureka Client
5:启动类

@EnableDiscoveryClient
@SpringBootApplication
public class Eureka2Application {

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

6:配置文件application.yml

server:
  port: 8020
spring:
  application:
    name: eureka2
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
  instance:
    prefer-ip-address: true
    metadata-map:
      my-metadata: 我自定义的元数据   #自定义的元数据,key和value可以随便写

7:新建Spring Boot项目Eureka3,添加依赖Eureka Client
8:启动类

@EnableDiscoveryClient
@SpringBootApplication
public class Application {

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

9:配置文件application.yml

server:
  port: 8030
spring:
  application:
    name: eureka3
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

10:Controller

@RestController
public class MyController {
  @Autowired
  private DiscoveryClient discoveryClient;

  @GetMapping("/user-instance")
  public List<ServiceInstance> showInfo()
  {
      //DiscoveryClient.getInstances(serviceId)可查询指定微服务在Eureka上的实例列表
      return this.discoveryClient.getInstances("eureka2");

  }
}

11:运行测试
启动项目Eureka1
启动项目Eureka2
启动项目Eureka3
访问:http://localhost:8761/eureka/apps
这里写图片描述
访问:http://localhost:8030/user-instance
这里写图片描述
可以看到,使用DiscoveryClient的API获得了用户微服务的各种信息,其中包含了标准元数据和自定义元数据;

Eureka Server的REST端点

Eureka Server提供了一些REST端点。非JVM的微服务可使用这些REST端点操作Eureka,从而实现注册与发现。
这里写图片描述
可以使用XML或者JSON与这些端点通信,默认是XML。

示例:注册微服务到Eureka Server上:
1:新建Spring Boot项目Eureka,添加依赖Eureka Server
2:启动类

@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {

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

3:配置文件application.yml

server:
  port: 8761                  
eureka:
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

4:编写XML,命名为rest-api-test.xml

<instance>
    <instanceId>itmuch:rest-api-test:9000</instanceId>
    <hostName>itmuch</hostName>
    <app>REST-API-TEST</app>
    <ipAddr>127.0.0.1</ipAddr>
    <vipAddress>rest-api-test</vipAddress>
    <secureVipAddress>rest-api-test</secureVipAddress>
    <status>UP</status>
    <port enabled="true">9000</port>
    <securePort enabled="false">443</securePort>
    <homePageUrl>http://127.0.0.1:9000/</homePageUrl>
    <statusPageUrl>http://127.0.0.1:9000/info</statusPageUrl>
    <healthCheckUrl>http://127.0.0.1:9000/health</healthCheckUrl>
    <dataCenterInfo class="com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo">
        <name>MyOwn</name>
    </dataCenterInfo>
</instance>

5:运行测试
启动项目Eureka
postman访问:http://localhost:8761/eureka/apps/rest-api-test,并添加刚刚编写的XML
这里写图片描述
此时查看Eureka Server首页,会发现微服务已经成功注册:
这里写图片描述

示例:查看某微服务的所有实例
访问:http://localhost:8761/eureka/apps/rest-api-test
这里写图片描述
从中,可以看到此微服务的所有实例,以及实例的详细信息!

示例:注销微服务实例
这里写图片描述
这里写图片描述

Eureka的自我保护

这里写图片描述
默认情况下,如果Eureka Server在一定时间内没有接收到某个微服务实例的心跳,Eureka Server将会注销该实例(默认90秒)。但是由于网络原因,微服务与Eureka Server之间无法正常通信,以上行为就会变得非常危险了——–因为微服务本身其实是健康的,此时本不应该注销这个微服务。
Eureka通过“自我保护模式”来解决这个问题——-当Eureka Server节点在短时间内丢失过多客户端时(可能发生了网络故障),那么这个节点就会进入自我保护模式。一旦进入该模式,Eureka Server就会保护服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)。当网络故障恢复后,该Eureka Server节点会自动退出自我保护模式。
综上,自我保护模式是一种应对网络异常的安全保护措施!
在Spring Cloud中,可以使用eureka.server.enable-self-preservation=false禁用自我保护模式。

eureka:
  server:
    enable-self-preservation: false  

这里写图片描述

多网卡环境下的IP选择

例如:某台服务器有eth0、eth1和eth2三块网卡,但是只有eth1可以被其他的服务器访问;如果Eureka Client将eth0或者eth2注册到Eureka Server上,其他微服务就无法通过这个IP调用该微服务的接口
1:忽略指定名称的网卡

spring:
  cloud:
    inetutils:
      ignored-interfaces:
        - docker0
        - veth.*

2:使用正则表达式,指定使用的网络地址

spring:
  cloud:
    inetutils:
      preferredNetworks:
        - 192.168
        - 10.0

3:只使用站点本地地址

spring:
  cloud:
    inetutils:
      useOnlySiteLocalInterfaces: true

4:手动指定IP地址

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
  instance:
    prefer-ip-address: true
    ip-address: 127.0.0.1

Eureka的健康检查

这里写图片描述
可知,Status一栏有一个UP,表示应用程序状态正常。应用状态还有其他取值,例如:DOWN、OUT_OF_SERVICE、UNKNOWN。只有标记为UP的微服务会被请求。
Eureka Server与Eureka Client之间使用心跳机制来确定Eureka Client的状态,默认情况下,服务器端与客户端的心跳保持正常,应用程序就会始终保持“UP”。
Spring Boot Actuator提供了/health端点,该端点可展示应用程序的健康信息。那么如何才能将该端点中的健康状态传播到Eureka Server呢?
要实现这一点,只需启用Eureka的健康检查。这样,应用程序就会将自己的健康状态传播到Eureka Server。

eureka:
  client:
    healthcheck:
      enabled: true 

但我测试没有反应,可能哪里还是没有配置好吧,以后再讨论它!!!

参考书籍:Spring Cloud与Docker微服务架构实战
以上只是学习所做的笔记,以供日后参考!!!

猜你喜欢

转载自blog.csdn.net/z1790424577/article/details/81172699