1、两组件
Eureka Server和Eureka Client
1⃣️Eureka Server:提供服务注册服务各个微服务节点通过配置启动后,会在EurekaServer中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观看到。
2⃣️EurekaClient:通过注册中心进行访问是一个Java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳(默认周期为30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,EurekaServer将会从服务注册表中把这个服务节点移除(默认90秒)
2、构建Eureka
2.1 构建Eureka Server
1⃣️建Medule
2⃣️改Pom
添加erurka server注解驱动
<!--eureka-server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
3⃣️写Yml
server:
port: 7001
eureka:
instance:
# 单机时eureka服务端的实例名称localhost
# hostname: localhost
# 集群时不能都叫localhost,设置好的域名(hosts文件)
hostname: eureka7001.com
client:
register-with-eureka: false # false表示不向注册中心注册自己。
fetch-registry: false # false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
service-url:
# 单机就是7001自己
# defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
# 集群指向其它eureka(相互注册)
defaultZone: http://eureka7002.com:7002/eureka/
# server:
# 关闭自我保护机制,保证不可用服务被及时踢除
# enable-self-preservation: false
# eviction-interval-timer-in-ms: 2000
4⃣️主启动
添加@EnableEurekaServer注解
@SpringBootApplication
@EnableEurekaServer
public class EurekaMain7001 {
public static void main(String[] args) {
SpringApplication.run(EurekaMain7001.class,args);
}
}
2.2 构建Eureka Client
1⃣️建Medule
2⃣️改Pom
添加eureka-client注解驱动
<!--eureka-client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
3⃣️写Yml
server:
port: 8001
spring:
application:
name: cloud-payment-service
datasource:
type: com.alibaba.druid.pool.DruidDataSource # 当前数据源操作类型
driver-class-name: org.gjt.mm.mysql.Driver # mysql驱动包
url: jdbc:mysql://localhost:3306/springcloud2020?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: 123456
druid:
test-while-idle: false
eureka:
client:
# 表示是否将自己注册进EurekaServer默认为true。
register-with-eureka: true
# 是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
fetchRegistry: true
service-url:
# 单机版
# defaultZone: http://localhost:7001/eureka
# 集群版
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
instance:
instance-id: payment8001
# 访问路径可以显示IP地址
prefer-ip-address: true
# Eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认是30秒)
# lease-renewal-interval-in-seconds: 1
# Eureka服务端在收到最后一次心跳后等待时间上限,单位为秒(默认是90秒),超时将剔除服务
# lease-expiration-duration-in-seconds: 2
mybatis:
mapperLocations: classpath:mapper/*.xml
type-aliases-package: com.atguigu.springcloud.entities # 所有Entity别名类所在包
4⃣️主启动
添加@EnableEurekaClient注解
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
public class PaymentMain8001 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain8001.class,args);
}
}
3、负载均衡
1⃣️订单服务网址不能写死,使用配置文件配好的spring.application.name属性替代。
CLOUD-PAYMENT-SERVICE
// public static final String PAYMENT_URL = "http://localhost:8001";
public static final String PAYMENT_URL = "http://CLOUD-PAYMENT-SERVICE";
2⃣️使用@LoadBalanced注解赋予RestTemplate负载均衡的能力
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
4、actuator微服务信息完善
1⃣️主机名称:服务名称修改
eureka:
instance:
instance-id: payment8001
2⃣️访问信息有IP信息提示
eureka:
instance:
# 访问路径可以显示IP地址
prefer-ip-address: true
5、服务发现Discovery
1⃣️对于注册进eureka里面的微服务,可以通过服务发现来获得该服务的信息
2⃣️主启动类上添加@EnableDiscoveryClient注解
3⃣️Eureka-Client的Controller
@RestController
@Slf4j
public class PaymentController {
@Value("${server.port}")
private String serverPort;
@Resource
private DiscoveryClient discoveryClient;
@GetMapping(value = "/payment/discovery")
public Object discovery(){
// 查看有哪些服务
List<String> services = discoveryClient.getServices();
for (String element : services) {
log.info("element:" + element);
}
List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
// 查看某个服务有哪些实例
for (ServiceInstance instance : instances) {
log.info(instance.getInstanceId()+"\t"+instance.getHost()+"\t"+instance.getPort()+"\t"+instance.getUri());
}
return this.discoveryClient;
}
}
6、Eureka自我保护
1⃣️含义:某时刻某一个微服务不可用了,Eureka不会立刻清理,依旧会对该微服务的信息进行保存。
2⃣️如何禁止自我保护
注册中心eureakeServer端7001:使用eureka.server.enable-self-preservation = false 可以禁用自我保护模式。
生产者客户端eureakeClient端8001:eureka.instance.lease-renewal-interval-in-seconds=30、eureka.instance.lease-expiration-duration-in-seconds=90修改发送心跳的间隔和最大等待时间。