Eureka的细节(首页显示微服务名、外网访问显示正确ip、详情信息、服务发现)
一、首页显示的微服务名
Eureka 首页显示的微服务名默认为:机器主机名:应用名称:应用端口,也就是:
${spring.cloud.client.hostname}:${spring.application.name}:${spring.application.instance_id}:${server.port}
我们很难识别,自定义显示名字
在application.yml配置文件中修改参数:
#eureka相关配置
eureka:
instance:
hostname: 127.0.0.1 (这里没关系)
#设置是否将自己作为客户端注册到注册中心(缺省true)
#这里为不需要,查看@EnableEurekaServer注解的源码,会发现它间接用到了@EnableDiscoveryClient
instance-id: userService-${spring.cloud.client.ipaddress}-${server.port}
二、给服务器一个正确的IP
上面我们给服务指定了一个更顺眼的名字,但是当我们把鼠标移到上面时,
显示的是:http://localhost:8084/actuator/info
可读性太低了,这里理论上应该是显示该服务自身的 ip 才对,那么如何让这里的 ip 显示正常呢?
在application.yml配置文件中修改参数:
#服务信息显示的真实的ip, 开发中一定要设置为true, 如果不设置, 其他电脑访问不到你的服务
prefer-ip-address: true
三、设置微服务的详细信息
但是默认情况下,是没有微服务的信息的,它是一个空的
显示{}
在大型项目中,微服务可能会有成百上千个,如果你没有填写微服务的信息,否则你的项目维护会非常痛苦。
填写微服务的信息
1、在你的微服务项目中添加actuator依赖,以及插件
<!-- 微服务的详细信息 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> 插件: <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <configuration> <delimiters> <delimiter>$</delimiter> </delimiters> </configuration> </plugin> </plugins> </build>
2、在项目的配置文件中,填写该微服务的信息:
#服务的描述信息
info:
app:
name: helloServer-microcloud
author:
name: hhj
build:
artifactId: $project.artifactId$
version: $project.version$
company:
name: www.zl.com
server:
port: ${server.port}
显示:
四、服务发现
通过上面一些配置,这个服务的相关信息可以说比较友好了。但是还有个问题啊,
我公司别名起好了,地址也有了,也录入地图里了,但是我怎么能让外界知道这些信息呢?
我得有个公司主页吧,也就是说,得有个入口让别人知道这些信息才行。
我们需要暴露一个接口给外界,专门提供本服务的详细信息。
写一个接口,暴露给外界调用:
@RestController @RequestMapping("/hello") public class InfoController { @Resource private EurekaClient client; private static final Logger LOGGER = LoggerFactory.getLogger(UserController.class); @GetMapping("/discovery") public Object discovery() { // 获取Eureka中所有的服务节点 List<Application> applications = client.getApplications().getRegisteredApplications(); if (applications != null) { for (Application application : applications) { // 对外暴露的服务名称 String name = application.getName(); // 只看hello服务信息 if ("house-userService".equalsIgnoreCase(name)) { // 服务有多少个实例,比如订单服务可能部署了多个,有多个订单服务注册到了eureka List<InstanceInfo> instances = application.getInstances(); LOGGER.info("所有的hello服务:{}", instances); if (instances != null) { for (InstanceInfo info : instances) { LOGGER.info("服务id:{}", info.getInstanceId()); LOGGER.info("服务主机:{}", info.getHostName()); LOGGER.info("服务端口:{}", info.getPort()); } } return instances; } } } return null; } }
需要引入 EurekaClient 端,在接口内部,通过 EurekaClient 获取到注册在 Eureka 上的所有 Application,
这里的 application 其实就是我们常说的服务节点,从而获取到服务节点的信息,
包括服务节点的名称、状态、IP、端口、心跳情况等信息。直接将服务的信息返回即可。