赞
踩
springcloud-eureka-7001
使用
spring-cloud-starter-netflix-eureka-server
<!-- spring-cloud-starter-eureka-server:已废弃 -->
<!-- spring-cloud-starter-netflix-eureka-server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<!-- 热部署 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
server: port: 7001 # Eureka配置 eureka: instance: # Eureka服务端的实例名字 hostname: localhost client: # 表示是否向 Eureka 注册中心注册自己 (这个模块本身是服务器,所以不需要) register-with-eureka: false # fetch-registry 是否拉取其他的服务;如果为 false,则表示自己为注册中心或服务提供者;服务消费者的话为 true fetch-registry: false # Eureka监控页面~ service-url: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
register-with-eureka
是否注册到eureka服务中;默认为true
fetch-registry
是否拉取其他的服务;默认为true
- 监控地址:
http://localhost:7001/
- 服务注册地址:
http://localhost:7001/eureka/
@EnableEurekaServer
开启 Eureka 服务端
@SpringBootApplication
@EnableEurekaServer
public class EurekaServer_7001 {
public static void main(String[] args) {
SpringApplication.run(EurekaServer_7001.class,args);
}
}
就是向 Eureka 中注册的一个个服务提供者
注册服务提供者
修改
springcloud-provider-dept-8001
使用
spring-cloud-starter-netflix-eureka-client
<!-- spring-cloud-starter-netflix-eureka-client -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
# Eureka配置:配置服务注册中心地址
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka/
添加
@EnableEurekaClient
注解
@SpringBootApplication
@EnableEurekaClient
public class DepartmentProvider_8001 {
public static void main(String[] args) {
SpringApplication.run(DepartmentProvider_8001.class,args);
}
}
分别启动注册中心、服务提供者
如果此时停掉springcloud-provider-dept-8001 等30s后 监控会开启保护机制:
修改前
# 配置 Eureka
eureka:
# ...
instance:
# 修改Eureka上的默认描述信息
instance-id: springcloud-provider-dept-8001
修改后
spring-boot-starter-actuator
已在父工程的spring-boot-dependencies
中管理,可以省略版本号,直接导入
<!-- actuator完善监控信息 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
# 配置 Eureka
eureka:
# ...
instance:
# ...
# 以IP地址注册到服务中心
prefer-ip-address: true
# 监控端口配置
management:
endpoints:
web:
exposure:
# 开启 info,health;新版本中只默认开启了 health
include: info,health
有三种方式
方式一
在 yml 或 properties 中配置
未成功:读取不到
info:
project:
name: xxx
version: 1.0.0
方式二
使用Meven的打包插件,生成
build-info.properties
方式三
自定义
Myinfo.java
配置类,实现InfoContributor
接口加上
@Component
注解;更加灵活
package com.tuwer.springcloud.config; import org.springframework.boot.actuate.info.Info; import org.springframework.boot.actuate.info.InfoContributor; import org.springframework.stereotype.Component; import java.util.HashMap; /** * @author 土味儿 * Date 2022/2/11 * @version 1.0 */ @Component public class MyInfo implements InfoContributor { @Override public void contribute(Info.Builder builder) { HashMap<String, Object> map = new HashMap<>(); // 可以从数据库获取信息 map.put("ServiceName","springcloud-provider-dept-8001"); map.put("version","1.0-SNAPSHOT"); map.put("author","tuwer"); builder.withDetails(map); } }
好死不如赖活着
一句话总结就是:某时刻某一个微服务不可用,eureka 不会立即清理,依旧会对该微服务的信息进行保存!
EMERGENCY!EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT.RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEGING EXPIRED JUST TO BE SAFE.
从警告中可以看到,eureka认为虽然收不到实例的心跳,但它认为实例还是健康的,eureka会保护这些实例,不会把它们从注册表中删掉。eureka.server.enable-self-preservation=false
【不推荐关闭自我保护机制】获取注册中心中的微服务信息
package com.tuwer.springcloud.controller; import com.tuwer.springcloud.pojo.Department; import com.tuwer.springcloud.service.DepartmentService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.web.bind.annotation.*; import java.util.List; /** * @author 土味儿 * Date 2022/2/9 * @version 1.0 */ @RestController public class DepartmentController { // ... @Autowired private DiscoveryClient discoveryClient; // ... @GetMapping("/department/discovery") public Object discovery(){ // 获取微服务列表的清单 List<String> services = discoveryClient.getServices(); System.out.println(services); // 得到一个具体的微服务信息,通过微服务id,applicaioinName List<ServiceInstance> instances = discoveryClient.getInstances("SPRINGCLOUD-PROVIDER-DEPT"); for (ServiceInstance instance : instances) { System.out.println( // 主机名称 instance.getHost() + "\t" + // 端口号 instance.getPort() + "\t" + // uri instance.getUri() + "\t" + // 服务id instance.getServiceId() ); } return this.discoveryClient; } }
@EnableDiscoveryClient
在主启动类中加入 @EnableDiscoveryClient 注解;默认就是开启的,可以省略
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
public class DepartmentProvider_8001 {
public static void main(String[] args) {
SpringApplication.run(DepartmentProvider_8001.class,args);
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。