Eureka 服务治理中心
- 服务中心三大核心: 服务注册中心,服务提供者,服务消费者;
- 服务提供者大多时候也是服务消费者;
- 服务消费者采用
Ribbon
方式消费。
注册中心:
- 启动类上,
@EnableEurekaServer
注解使改服务成为注册中心;
@EnableEurekaServer
@SpringBootApplication
public class ServerApplication {
public static void main(String[] args) {
SpringApplication.run(ServerApplication.class, args);
}
}
- 注册中心只需提供一个场所,不需要检测服务以及注册自己(在Eureka中这两点是默认
true
的);
eureka.client.register-with-eureka=false
eureka.client.fetch-register=false
- 配置
application.properties
文件中引入:
server.port=2222
eureka.instance.hostname=localhost
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone = http://${eureka.instance.hostname}:${server.port}/eureka/
eureka.server.enable-self-preservation=false
- 至此Eureka服务端完成,启动访问
http://localhost:2222
可看到此页面,此时没有服务提供者,就没有实例服务的状态;
服务提供者
- 服务提供者需要提供服务注册到注册中心中,同时也能检索到其他服务;在配置文件中配置相对简单;只需要对服务进行命名以及告诉提供者注册中心地址即可;如果要用ip的形式,需要加入配置参数
eureka.instance.prefer-ip-address=true
,
- 加入
eureka.instance.lease-renewal-interval-in-seconds=30
目的是为了向注册中心提供一个心跳,来告诉注册中心服务还“活着”,从而不剔除起服务实例,参数默认值为30;
eureka.instance.lease-expiration-duration-in-seconds=90
,作用是在服务无反应90s后,注册中心剔除服务,此参数默认值为90;
- 配置
application.properties
文件中引入:
server.port=8090
spring.application.name=hello-service
eureka.client.serviceUrl.defaultZone=http://localhost:2222/eureka/
eureka.instance.lease-renewal-interval-in-seconds=30
eureka.instance.lease-expiration-duration-in-seconds=90
- 启动类上加上注解
@EnableDiscoveryClient
,使其能够被发现;
@EnableDiscoveryClient
@SpringBootApplication
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
@RestController
@RequestMapping("/access")
public class AccessController {
private static final Logger logger = LoggerFactory.getLogger(AccessController.class);
@Autowired
private DiscoveryClient client;
@RequestMapping("/hello")
public String index(){
ServiceInstance instance = client.getLocalServiceInstance();
logger.info("hello, host:+"+instance.getHost() + ", service_id:"+ instance.getServiceId());
return "Hello world";
}
}
- 启动程序访问注册中心
http://localhost:2222/eureka
即可看到该实例的信息:
服务消费者
- 服务提供者大多数也是服务消费者,在配置上与提供者一致;
- 服务消费者采用
Ribbon
的方式消费服务,Ribbon
是一种客户端负载均衡器;
- 配置
application.properties
文件中引入:
server.port=9000
spring.application.name=consumer-service
eureka.client.serviceUrl.defaultZone=http://localhost:2222/eureka/
eureka.instance.lease-renewal-interval-in-seconds=30
eureka.instance.lease-expiration-duration-in-seconds=90
- 在启动类上加上一个
@LoadBalance
注解,以及注入@Bean
,采用RestTemplate
来调用;
@EnableDiscoveryClient
@SpringBootApplication
public class ConsumerApplication {
@Bean
@LoadBalanced
RestTemplate restTemplate(){
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
- 在消费者中新建一个
controller
来对提供者的接口进行调用;
@RestController
@RequestMapping(value = "/consumer")
public class ConsumerController {
@Autowired
RestTemplate restTemplate;
@RequestMapping(value = "/robbin")
public String helloConsumer(){
return restTemplate.getForEntity("http://HELLO-SERVICE/access/hello",String.class).getBody();
}
}
- 服务治理的重点就是服务,所以调用是直接用的是
HELLO-SERVICE
服务进行调用;访问消费者的接口,在提供者的日志中看得到如下图: