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端口内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • redis分布式锁的实现原理详解

    redis分布式锁的实现原理详解

    这篇文章主要为大家详细介绍了redis分布式锁,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • Spring Boot 中使用 Mybatis Plus的操作方法

    Spring Boot 中使用 Mybatis Plus的操作方法

    本文介绍了如何在 Spring Boot 项目中集成 Mybatis Plus,Spring Boot 与 MyBatis Plus 的集成非常简单,通过自动配置和简洁的 API,可以大大减少开发中常见的数据库操作代码,需要的朋友参考下吧
    2024-12-12
  • java poi设置生成的word的图片为上下型环绕以及其位置的实现

    java poi设置生成的word的图片为上下型环绕以及其位置的实现

    这篇文章主要介绍了java poi设置生成的word的图片为上下型环绕以及其位置的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • SpringBoot feign动态设置数据源(https请求)

    SpringBoot feign动态设置数据源(https请求)

    这篇文章主要介绍了SpringBoot如何在运行时feign动态添加数据源,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2021-08-08
  • Java设计模式之责任链模式

    Java设计模式之责任链模式

    这篇文章介绍了Java设计模式之责任链模式,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • Java连接ftp服务器实例代码

    Java连接ftp服务器实例代码

    这篇文章主要介绍了Java连接ftp服务器实例代码 的相关资料,需要的朋友可以参考下
    2015-12-12
  • MyBatis之自查询使用递归实现 N级联动效果(两种实现方式)

    MyBatis之自查询使用递归实现 N级联动效果(两种实现方式)

    这篇文章主要介绍了MyBatis之自查询使用递归实现 N级联动效果,本文给大家分享两种实现方式,需要的的朋友参考下吧
    2017-07-07
  • Java DFA算法案例详解

    Java DFA算法案例详解

    这篇文章主要介绍了Java DFA算法案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • 简单实现Servlet文件下载功能

    简单实现Servlet文件下载功能

    这篇文章主要教大家如何简单实现Servlet文件下载功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • java仿QQ连连看游戏

    java仿QQ连连看游戏

    这篇文章主要为大家详细介绍了java仿QQ连连看游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01

最新评论