一、Nacos

Nacos 是一个开源的服务发现、配置管理和服务管理平台,主要用于支持微服务架构中的服务注册与发现、配置管理、动态 DNS 服务和服务监控等功能

在微服务架构中,服务的数量很多,服务之间的依赖关系很复杂,因此需要一个集中化的服务注册与发现平台来管理这些服务。Nacos 在微服务架构中的作用有:

  • 服务注册与发现:Nacos 可以让服务实例将自己注册到 Nacos 中心,其他服务可以通过 Nacos 中心来发现这些服务实例。Nacos 支持多种服务注册方式,例如 DNS、HTTP、TCP 和 UDP 等。

  • 配置管理:Nacos 可以让服务实例动态地获取配置信息,而不必重新部署或重启服务实例。这样可以方便地进行配置的修改和管理,提高了系统的灵活性和可维护性。

  • 动态 DNS 服务:Nacos 可以提供动态 DNS 服务,将服务实例的 IP 地址映射到域名上,从而实现服务的负载均衡和高可用性。

  • 服务管理:Nacos 可以提供服务的健康检查、流量管理、服务降级、服务熔断等功能,帮助开发者更好地管理和监控服务。

二、将服务注册到Nacos

将微服务注册到 Nacos 中的主要原因是为了实现服务发现和负载均衡。

在application.properties中将微服务注册进来:

# nacos服务地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

127.0.0.1:8848,表示 Nacos 服务注册中心运行在本地 IP 地址为 127.0.0.1,端口号为 8848 上。

需要将该配置项添加到 application.properties 或 application.yml 配置文件中,以告诉 Spring Cloud Nacos 服务注册中心的地址。Spring Cloud Nacos 在启动时会读取该配置项,并自动将服务注册到指定的 Nacos 服务注册中心。

当有多个 Nacos 服务注册中心时,可以将多个地址用逗号分隔开,例如:

spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848,127.0.0.1:8849

这表示将会同时向两个 Nacos 服务注册中心进行服务注册和发现。

三、微服务之间的调用

微服务之间可以通过 HTTP、RPC 和消息队列等方式进行调用。

在一个 Spring Cloud 项目中,不同的微服务模块之间可以通过 Spring Cloud 提供的服务注册与发现机制来进行调用。可以采用以下步骤来实现微服务之间的调用:

  • 在每个微服务模块中,使用 Spring Cloud 提供的服务注册与发现组件(例如 Eureka、Consul、Zookeeper 或 Nacos 等)将自己注册到注册中心。

  • 在需要调用其他微服务模块的模块中,通过服务发现机制(例如使用 Ribbon 或 Feign 等)从注册中心获取需要调用的微服务的地址信息。

  • 使用 HTTP、RPC 或消息队列等方式,通过获取到的微服务地址信息来进行调用。具体调用方式可以根据具体的场景和需求选择,例如使用 RestTemplate 或 Feign 进行 HTTP 调用,使用 gRPC 或 Dubbo 进行 RPC 调用,使用 RabbitMQ 或 Kafka 进行消息通信等。

四、具体调用实现(一)

采用以下步骤来调用在 Nacos 中心注册的微服务:
(1)在需要调用 Nacos 中心注册的微服务的模块中,添加 Nacos 相关依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

(2)在需要调用 Nacos 中心注册的微服务的类中,使用 @NacosInjected 注解来注入 NacosServiceManager 对象:

@RestController
public class MyController {

    @NacosInjected
    private NacosServiceManager nacosServiceManager;

    // 其他代码...
}

NacosServiceManager对象可以用来获取 Nacos 中心上的服务信息。

(3)在需要调用 Nacos 中心注册的微服务的类中,使用 nacosServiceManager 对象的 getService 方法来获取指定服务的实例信息:

@RestController
public class MyController {

    @NacosInjected
    private NacosServiceManager nacosServiceManager;

    @GetMapping("/hello")
    public String hello() {
        // 获取服务实例信息
        ServiceInstance serviceInstance = nacosServiceManager.getService("service-provider");
        // 组装服务 URL
        String serviceUrl = "http://" + serviceInstance.getIp() + ":" + serviceInstance.getPort();
        // 发起服务调用
        RestTemplate restTemplate = new RestTemplate();
        String result = restTemplate.getForObject(serviceUrl + "/hello", String.class);
        return result;
    }
}

在上面的代码中,nacosServiceManager.getService("service-provider") 方法可以获取名为 service-provider 的微服务的实例信息,serviceInstance.getIp()serviceInstance.getPort() 方法可以分别获取服务实例的 IP 地址和端口号,然后可以通过 RestTemplate的restTemplate.getForObject 或其他 HTTP 客户端库来发起服务调用。

调用在 Nacos 中心注册的微服务的模块不需要在 Nacos 中心进行注册,只有微服务本身才需要将自己注册到 Nacos 中心,以便其他微服务可以发现和调用它。

五、具体调用实现(二)

在调用微服务时,可以通过 Nacos 提供的服务注册与发现机制,从 Nacos 中心获取需要调用的微服务的地址信息,然后使用该地址信息进行调用。

(1)在调用微服务的模块中添加 Nacos 客户端依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

(2)在需要调用微服务的代码中,使用 Spring Cloud 提供的服务发现组件(例如 Ribbon 或 Feign 等)从 Nacos 中心获取服务实例信息:

@Service
public class MyService {

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private LoadBalancerClient loadBalancerClient;

    public String callService() {
        // 从 Nacos 中心获取服务实例信息
        ServiceInstance serviceInstance = loadBalancerClient.choose("service-provider");
        String serviceUrl = "http://" + serviceInstance.getHost() + ":" + serviceInstance.getPort() + "/hello";
        String result = restTemplate.getForObject(serviceUrl, String.class);
        return result;
    }
}

在上面的代码中,loadBalancerClient.choose(“service-provider”) 方法会从 Nacos 中心获取名为 service-provider 的微服务的实例信息,然后使用 RestTemplate 或其他 HTTP 客户端库来发起服务调用。

LoadBalancerClient 是 Spring Cloud 提供的负载均衡客户端接口,用于从服务注册中心获取服务实例信息,并根据负载均衡策略选择一个实例进行服务调用。

在实际应用中,通常会使用 Spring Cloud 提供的 Feign 或 OpenFeign 等客户端库来调用微服务,这样可以避免手动使用 RestTemplate 和负载均衡组件进行服务调用。


相关文章:
https://blog.csdn.net/m0_67393619/article/details/126081197
http://www.wityx.com/post/113355_1_1.html

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐