Eureka 注册中心
简述
在Eureka架构中,微服务角色有两类:
- EurekaServer:服务端,注册中心
- 记录服务信息
- 心跳监控
- EurekaClient:客户端
- Provider:服务提供者,例如案例中的user-service
- 注册自己的信息到EurekaServer
- 每隔30秒向EurekaServer发送心跳
- consumer:服务消费者,例如案例中的order-service
- 根据服务名称从EurekaServer拉取服务列表
- 基于服务列表做负载均衡,选中一个微服务后发起远程调用
- Provider:服务提供者,例如案例中的user-service
注册发现
1.搭建EurekaServer
引入eureka-server依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
添加@EnableEurekaServer注解
@SpringBootApplication @EnableEurekaServer public class EurekaMain{ public static void main(String[] args) { SpringApplication.run(EurekaMain.class, args); } }
在application.yml中配置eureka地址
server: port: 7001 eureka: instance: hostname: eureka-server client: # 不向注册中心注册自己 register-with-eureka: false # 表示自己是注册中心,提供维护服务,不需要检索服务 fetch-registry: false service-url: defaultZone: http://eureka7001.com:7001/eureka
2.服务注册
引入eureka-client依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
在application.yml中配置eureka地址
eureka: client: fetch-registry: true register-with-eureka: true service-url: defaultZone: http://localhost:7001/eureka instance: instance-id: payment
启动类上加注解
@SpringBootApplication @EnableEurekaClient @EnableDiscoveryClient public class PaymentMain { public static void main(String[] args) { SpringApplication.run(PaymentMain.class, args); } }
3.服务发现
引入eureka-client依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
在application.yml中配置eureka地址
eureka: client: fetch-registry: true register-with-eureka: true service-url: defaultZone: http://localhost:7001/eureka spring: application: name: cloud-order-service
给RestTemplate添加@LoadBalanced注解
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
@RestController
@Slf4j
public class OrderController {
public static final String PAYMENT_URL = "http://CLOUD-PAYMENT-SERVICE";
@Resource
private RestTemplate restTemplate;
@GetMapping("/consumer/payment/create")
public CommonResult<Payment> create(Payment payment) {
return restTemplate.postForObject(PAYMENT_URL + "/payment/create", payment, CommonResult.class);
}
@GetMapping("/consumer/payment/get/{id}")
public CommonResult<Payment> getPayment(@PathVariable("id") Long id) {
return restTemplate.getForObject(PAYMENT_URL + "/payment/get/" + id, CommonResult.class);
}
禁止自我保护
eureka:
server:
enable-self-preservation: false #默认开启
eviction-interval-timer-in-ms: 2000 #2s