一、注册中心是什么
注册中心是一个分布式系统中的关键组成部分,它可以统一管理服务的注册与发现,用于解决分布式系统中服务间的相互调用问题。通过中心化管理,可以对服务的注册和下线进行管理,同时实现负载均衡等功能。在这里以Eureka为例,来介绍注册中心具体是如何工作的。
@SpringBootApplication @EnableEurekaServer public class EurekaApplication { public static void main(String[] args) { SpringApplication.run(EurekaApplication.class, args); } }
如上所示,启动一个Eureka注册中心非常简单,只需要引入Spring Cloud Eureka依赖,并在启动类上添加注解@EnableEurekaServer即可。
二、服务注册与发现
对于服务提供者,将自己服务注册到注册中心非常简单。在服务启动时,只需要向注册中心注册自己的服务名、实例IP地址、端口等信息即可。示例代码如下:
@RestController @EnableEurekaClient public class DemoController { @Value("${server.port}") String port; @RequestMapping("/hello") public String home(@RequestParam String name) { return "hello " + name + ",i am from port:" + port; } }
在代码中,通过添加@EnableEurekaClient注解,将该服务注册到了Eureka注册中心,同时通过@Value注解注入服务实例的端口信息。客户端通过向注册中心发送查询请求,就可以获得可用的服务实例信息。代码如下:
@SpringBootApplication @EnableDiscoveryClient public class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); } @Bean @LoadBalanced RestTemplate restTemplate() { return new RestTemplate(); } @Autowired RestTemplate restTemplate; @RequestMapping("/callService") public String callService(@RequestParam String name) { return restTemplate.getForObject("http://service/hello?name=" + name, String.class); } }
使用RestTemplate向服务提供者发送HTTP请求时,只需要通过服务名即可获取可用的服务,这里的服务名就是在服务提供者向Eureka注册中心注册时指定的服务名。通过添加@EnableDiscoveryClient注解,就可以让该服务具有服务发现的能力。
三、高可用性与负载均衡
为了保证高可用性,我们需要搭建多个Eureka Server,同时让它们相互注册到对方。当其中一台Eureka Server挂掉时,其他Eureka Server就可以接管它的职责。这里以双节点的集群为例,来介绍Eureka Server的高可用性配置。
server.port=8761 eureka.instance.hostname=localhost eureka.client.register-with-eureka=false eureka.client.fetch-registry=false eureka.client.service-url.defaultZone=http://localhost:8762/eureka/
在上述配置中,将当前Eureka Server注册到了localhost:8762上,同时禁止了该实例作为服务提供者进行注册。启动时指定不同的配置,就可以启动不同端口上的Eureka Server,从而搭建出一个Eureka Server集群。