为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微服务架构实战
以上只是学习所做的笔记,以供日后参考!!!