📜  spring 服务发现 (1)

📅  最后修改于: 2023-12-03 15:05:16.716000             🧑  作者: Mango

Spring 服务发现

Spring 服务发现是在分布式系统中自动寻找服务实例的一种机制。当使用微服务架构时,通过服务发现机制可以更加容易地实现服务的发现和调用,从而提高系统的可靠性和可拓展性。

服务发现的概念

服务发现是在分布式系统中,通过把服务注册到一个共享的注册中心中,然后通过服务发现机制去查询可用的服务实例。服务发现的主要概念如下:

  • 服务注册:服务提供者将自己的服务实例注册到服务注册中心,包括服务的名称、IP地址和端口号等信息。
  • 服务发现:服务消费者从服务注册中心查询可用的服务实例列表,并选择一个可用的服务实例进行调用。
  • 负载均衡:在服务发现时,服务消费者可根据负载均衡策略来选择一个可用的服务实例。常用的负载均衡算法包括轮询、随机、加权轮询和加权随机等。
Spring 服务发现的实现

Spring Cloud 提供了一套完整的服务治理方案,其中包括服务注册与发现、负载均衡、断路器等功能。Spring Boot 应用可以将自己作为服务提供者注册到注册中心,也可以作为服务消费者去发现服务并调用其接口。

服务注册

服务注册功能由 Spring Cloud Eureka 实现,基于 Netflix Eureka 构建。要使用 Eureka,只需要在 pom.xml 中添加以下依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

然后在启动类上添加 @EnableEurekaServer 注解,就可以将应用注册为 Eureka 服务器了。

@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class, args);
    }

}

在应用启动后,可以通过 http://localhost:8761 查看注册中心的管理后台。

服务发现

服务发现功能由 Spring Cloud Netflix Ribbon 实现,Ribbon 是一种客户端负载均衡器。在使用 Ribbon 之前,需要在 pom.xml 中添加以下依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>

然后在应用主类上添加 @EnableDiscoveryClient 注解,表示应用作为服务消费者注册到服务发现中心。

@SpringBootApplication
@EnableDiscoveryClient
public class ConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }

}

在使用 Ribbon 调用服务时,可以通过 LoadBalancerClient 获取注册中心的服务列表,然后根据负载均衡策略选择一个可用的服务。

@Service
public class OrderService {

    @Autowired
    private LoadBalancerClient loadBalancerClient;

    @HystrixCommand(fallbackMethod = "getDefaultOrder")
    public String getOrder() {
        ServiceInstance instance = loadBalancerClient.choose("order-service");
        String url = "http://" + instance.getHost() + ":" + instance.getPort() + "/order";
        RestTemplate restTemplate = new RestTemplate();
        String result = restTemplate.getForObject(url, String.class);
        return result;
    }

    public String getDefaultOrder() {
        return "default order";
    }

}
负载均衡

Ribbon 提供了多种负载均衡策略,可以按需配置。默认的负载均衡策略是轮询,即依次访问可用的服务实例。如果要修改负载均衡策略,只需要在应用配置文件中添加以下内容:

order-service:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

其中 RandomRule 表示采用随机的负载均衡策略。

总结

Spring Cloud 提供了完整的服务发现方案,可以方便地实现服务的注册、发现和调用。在微服务架构中,使用服务发现可以提高系统的可靠性和可拓展性,是一种非常有价值的技术。