接上文 ……
注意
:以下是针对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地址进行注册:
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