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热部署设置方法详解

    SpringBoot热部署设置方法详解

    在实际开发中,每次修改代码就需要重启项目,重新部署,对于一个后端开发者来说,重启确实很难受。在java开发领域,热部署一直是一个难以解决的问题,目前java虚拟机只能实现方法体的热部署,对于整个类的结构修改,仍然需要重启项目
    2022-10-10
  • Java servlet通过事件驱动进行高性能长轮询详解

    Java servlet通过事件驱动进行高性能长轮询详解

    这篇文章主要介绍了基于servlet3.0+事件驱动实现高性能长轮询的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2022-06-06
  • SpringBoot整合Mybatis Plus实现基本CRUD的示例代码

    SpringBoot整合Mybatis Plus实现基本CRUD的示例代码

    Mybatis Plus是在Mybatis的基础上的增强,使得我们对一些基本的CRUD使用起来更方便,本文主要介绍了SpringBoot整合Mybatis Plus实现基本CRUD的示例代码,具有一定的参考价值,感兴趣的可以了解一下
    2023-05-05
  • Java微信公众平台开发(14) 微信web开发者工具使用

    Java微信公众平台开发(14) 微信web开发者工具使用

    这篇文章主要为大家详细介绍了Java微信公众平台开发第十四步,微信web开发者工具的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • 如何基于Springboot完成新增员工功能并设置全局异常处理器

    如何基于Springboot完成新增员工功能并设置全局异常处理器

    最近工作中遇到了做一个管理员工信息的功能,下面这篇文章主要给大家介绍了关于如何基于Springboot完成新增员工功能并设置全局异常处理器的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-11-11
  • Java防止频繁请求、重复提交的操作代码(后端防抖操作)

    Java防止频繁请求、重复提交的操作代码(后端防抖操作)

    在客户端网络慢或者服务器响应慢时,用户有时是会频繁刷新页面或重复提交表单的,这样是会给服务器造成不小的负担的,同时在添加数据时有可能造成不必要的麻烦,今天通过本文给大家介绍下Java防止频繁请求、重复提交的操作代码,一起看看吧
    2022-04-04
  • SpringBoot参数验证10个技巧值得收藏

    SpringBoot参数验证10个技巧值得收藏

    Spring Boot提供了内置的验证注解,可以帮助简单、快速地对输入字段进行验证,例如检查 null 或空字段、强制执行长度限制、使用正则表达式验证模式以及验证电子邮件地址,那么在Spring Boot应用中如何做好参数校验工作呢,本文提供了10个小技巧感兴趣的朋友一起看看吧
    2023-08-08
  • 图解如何在Spring Boot中使用JSP页面

    图解如何在Spring Boot中使用JSP页面

    这篇文章主要介绍了图解如何在Spring Boot中使用JSP页面,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • netty服务端辅助类ServerBootstrap创建逻辑分析

    netty服务端辅助类ServerBootstrap创建逻辑分析

    这篇文章主要介绍了netty服务端辅助类ServerBootstrap创建逻辑分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03
  • Java中区别.toString() ,(String),valueOf()方法

    Java中区别.toString() ,(String),valueOf()方法

    这篇文章主要介绍了Java中区别.toString() ,(String),valueOf()方法,需要的朋友可以参考下
    2017-01-01

最新评论