Spring Cloud根据服务名获取服务的ip端口问题

 更新时间:2022年09月09日 09:47:36   作者:怪 咖@  
这篇文章主要介绍了Spring Cloud根据服务名获取服务的ip端口,本篇示例我就以Nacos注册中心为例了,下面是我注册的两个服务,需要的朋友可以参考下

本篇示例我就以Nacos注册中心为例了,下面是我注册的两个服务。其中nacos-payment-provider服务是集群,有两个实例。

方式一:通过loadBalancerClient来获取

如果使用的Nacos为注册中心的时候会发现一个问题,当引入的依赖版本比较高的时候,RestTemplate+@LoadBalanced 通过服务名称调用的时候会报错,使用其他注册中心默认都会引用ribbon依赖,因此我们只需要在注入RestTemplate的时候加上@LoadBalanced就可以实现根据名称负载均衡调用。

而nacos高版本依赖包没有引用ribbon依赖。ribbon早就已经彻底停更了,spring又自己出了一个loadbalancer负载均衡框架,来配合RestTemplate使用。但是他并没有自动引用loadbalancer依赖所以我们需要自己引用才可以使用。

@Configuration
public class ApplicationContextBean {
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}

使用如下获取ip端口的前提:引用了loadbalancer来作为负载均衡

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

loadBalancerClient.choose()这个方法就是负载均衡的核心方法。假如服务名称为nacos-payment-provider有两个实例,一个9001一个9002,通过如下方法调用会发现每次都是在轮询。

@Autowired
private LoadBalancerClient loadBalancerClient;

@GetMapping("/getServiceInstance")
public ServiceInstance getServiceInstance() {
    ServiceInstance serviceInstance = loadBalancerClient.choose("nacos-payment-provider");
    System.out.println(serviceInstance.getHost()); // ip
    System.out.println(serviceInstance.getPort()); // 端口
    System.out.println(serviceInstance.getInstanceId()); // 实例id
    System.out.println(serviceInstance.getServiceId()); // 服务id
    System.out.println(serviceInstance.getMetadata()); // 与服务实例关联的元数据
    System.out.println(serviceInstance.getScheme());    // 返回服务实例的方案
    System.out.println(serviceInstance.getUri().toString()); // 返回服务的uri地址
    return serviceInstance;
}

loadbalancer源码:

方式二:通过discoveryClient来获取

这种方式其他注册中心也可以使用!

@Resource
private DiscoveryClient discoveryClient;

@GetMapping("/getServiceInstanceList")
public List<ServiceInstance> getServiceInstanceList() {
	// 根据服务名称查找所有的实例
    return discoveryClient.getInstances("nacos-payment-provider");
}

DiscoveryClient这个其实是个接口存放于cloud-commons包当中。

既然是接口为什么他能获取到呢?我们可以看他的实现类,是有如下实现类的,也就是在nacos的服务发现依赖当中会存在他的实现类,并注入到容器当中了。其他注册中心也是同样如此。可以说这个接口是共用的,其他的注册中心都可以来实现。

方式三:通过NacosServiceManager来获取

这个是nacos独有的!

@Autowired
private NacosServiceManager nacosServiceManager;

@Autowired
private NacosDiscoveryProperties nacosDiscoveryProperties;
    
@GetMapping("/nacos")
public List<Instance> getGatewayAddress() {
    String res = null;
    try {
        NamingService namingService = nacosServiceManager.getNamingService(nacosDiscoveryProperties.getNacosProperties());
        List<Instance> allInstances = namingService.getAllInstances("nacos-payment-provider");
        return allInstances;
    } catch (NacosException e) {
        e.printStackTrace();
        return null;
    }
}

到此这篇关于Spring Cloud根据服务名获取服务的ip端口的文章就介绍到这了,更多相关Spring Cloud ip端口内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot整合freemarker实现代码生成器

    SpringBoot整合freemarker实现代码生成器

    这篇文章主要为大家详细介绍了SpringBoot如何整合freemarker实现一个简单的代码生成器,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2023-03-03
  • Java mysql特殊形式的查询语句详解

    Java mysql特殊形式的查询语句详解

    这篇文章主要介绍了Java mysql特殊形式的查询,包括子查询和联合查询、自身连接查询问题,本文通过sql语句给大家介绍的非常详细,需要的朋友可以参考下
    2022-02-02
  • 关于Java的Condition接口最佳理解方式

    关于Java的Condition接口最佳理解方式

    这篇文章主要介绍了关于Java的Condition接口最佳理解方式,Condition就是实现了管程里面的条件变量,Java 语言内置的管程里只有一个条件变量,而Lock&Condition实现的管程支持多个条件变量,需要的朋友可以参考下
    2023-05-05
  • 在Ubuntu系统下安装JDK和Tomcat的教程

    在Ubuntu系统下安装JDK和Tomcat的教程

    这篇文章主要介绍了在Ubuntu系统下安装JDK和Tomcat的教程,这样便是在Linux系统下搭建完整的Java和JSP开发环境,需要的朋友可以参考下
    2015-08-08
  • Java实现对象复制的方法实例

    Java实现对象复制的方法实例

    这篇文章主要介绍了Java实现对象复制的方法实例,深复制:复制出来的对象中的变量(包括基本类型和字符串)和原来的对象的值都相同,引用对象也会指向复制出来的对象,需要的朋友可以参考下
    2023-08-08
  • Java web Hibernate如何与数据库链接

    Java web Hibernate如何与数据库链接

    这篇文章主要介绍了Java web Hibernate如何与数据库链接,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • VsCode搭建Spring Boot项目并进行创建、运行、调试

    VsCode搭建Spring Boot项目并进行创建、运行、调试

    这篇文章主要介绍了VsCode搭建Spring Boot项目并进行创建、运行、调试 ,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • SpringIOC DI循环依赖实例详解

    SpringIOC DI循环依赖实例详解

    这篇文章主要介绍了SpringIOC——DI循环依赖,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Gson序列化指定忽略字段的三种写法详解

    Gson序列化指定忽略字段的三种写法详解

    在我们日常使用json序列化框架过程中,经常会遇到在输出json字符串时,忽略某些字段,那么在Gson框架中,要想实现这种方式,可以怎么处理呢,本文就来介绍一下
    2021-10-10
  • 详解Java类加载器与双亲委派机制

    详解Java类加载器与双亲委派机制

    这篇文章主要为大家介绍一下Java中的类加载器与双亲委派机制,文中通过示例为大家进行了详细的介绍,对我们学习Java有一定帮助,需要的可以参考一下
    2022-08-08

最新评论