SpringCloud服务的发现与调用详解

 更新时间:2022年07月16日 14:14:36   作者:_时光煮雨  
在Java微服务越来越火的今天。几乎什么公司都在搞微服务。而使用的比较多的就是Spring Cloud技术栈。今天就来研究一下Spring Cloud中服务发现与调用的基本原理

相关推荐

上一章:Eureka注册中心

前言

上一章中,我们介绍了Eureka注册中心及集群的搭建,这一节将介绍服务的发现和调用。注意,这个时候我们只有注册中心,并没有引入其他的组件,所以需要使用SpringCloud原生态的服务发现和调用的方式实现,循序渐进的带你走入微服务的世界。

上篇文章我们已经创建好了注册中心,这次我们需要创建一个服务提供者(provider)和一个服务消费者(consumer)两个项目。

一、服务提供者

  • 新建Maven项目provider
  • 引入项目依赖
    <parent>
        <groupId>com.cxy965</groupId>
        <artifactId>parent</artifactId>
        <version>1.0-SNAPSHOT</version>
        <relativePath>../parent/pom.xml</relativePath>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    </dependencies>

新建配置文件application.yml

server:
  port: 8002
spring:
  application:
    name: provider
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8001/eureka/
    fetch-registry: true

创建启动类和服务接口,为了简便,暂时将服务接口放在了启动类,实际项目中,最好还是要放在controller中。

@EnableEurekaClient
@SpringBootApplication
@RestController
public class ProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProviderApplication.class, args);
    }
    @GetMapping("/hello")
    public String hello(String name) {
       return "Hello "+name;
    }
}

启动验证一下,可以正常返回。

二、服务消费者

  • 参考provider项目创建consumer项目
  • 修改配置文件中的端口和应用名称为8003、consumer
  • 创建启动类和服务消费代码
@EnableEurekaClient
@SpringBootApplication
@RestController
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }
    @Bean
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
    @Autowired
    DiscoveryClient discoveryClient;
    @Autowired
    RestTemplate restTemplate;
    @GetMapping("/hello")
    public String hello(String name) {
        List<ServiceInstance> list = discoveryClient.getInstances("provider");
        ServiceInstance instance = list.get(0);
        String host = instance.getHost();
        int port = instance.getPort();
        String returnInfo = restTemplate.getForObject("http://" + host + ":" + port + "/hello?name={1}", String.class, name);
        return returnInfo;
    }
}

启动验证一下

可以看到,我们调用8003消费者服务,消费者服务又调用了8002服务提供者的接口,并正确返回了结果。

总结

我们来分析一下消费者代码,我们先创建了一个RestTemplate Bean实例,然后注入进来,同时注入discoveryClient对象。

在接口中,通过discoveryClient.getInstances("provider")方法获取注册到注册中心中的所有provider服务信息ServiceInstance集合,ServiceInstance其实是一个接口,真正的实现类是EurekaServiceInstance,通过查看EurekaServiceInstance的源码,我们发现它里面包含了注册中心中各服务的丰富的详细信息(如主机地址、端口号、实例id,应用名称、应用组名称等)。

我们先拿到第一个服务提供者的的ip和端口(集群部署情况下,可能会有多个实例),然后通过调用restTemplate.getForObject()方法进行接口的调用并获取返回信息。

这样就通过原生态的方式实现了服务的发现和调用。

拿到第一个实例进行接口的调用,显然没有达到部署多服务实例的目的,下一篇文章将带你实现一个自定义的负载均衡器,一起期待吧!

到此这篇关于SpringCloud服务的发现与调用详解的文章就介绍到这了,更多相关SpringCloud服务内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅谈JAVA实现选择排序,插入排序,冒泡排序,以及两个有序数组的合并

    浅谈JAVA实现选择排序,插入排序,冒泡排序,以及两个有序数组的合并

    这篇文章主要介绍了JAVA实现选择排序,插入排序,冒泡排序,以及两个有序数组的合并,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • Spring的编程式事务和声明式事务详解

    Spring的编程式事务和声明式事务详解

    这篇文章主要介绍了Spring的编程式事务和声明式事务的相关内容,涉及Spring事务属性、Spring事务的基本类等知识,需要的朋友可以了解下。
    2017-09-09
  • 详解SpringBoot Schedule配置

    详解SpringBoot Schedule配置

    本篇文章主要介绍了详解SpringBoot Schedule配置 ,可以实现定时任务,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • Java web数据可视化实现原理解析

    Java web数据可视化实现原理解析

    这篇文章主要介绍了Java web数据可视化实现原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • 详解IDEA中MAVEN项目打JAR包的简单方法

    详解IDEA中MAVEN项目打JAR包的简单方法

    本篇文章主要介绍了详解IDEA中MAVEN项目打JAR包的简单方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • Java容器源码LinkedList原理解析

    Java容器源码LinkedList原理解析

    这篇文章主要介绍了Java容器源码LinkedList原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • Spring Cloud Hystrix 线程池队列配置(踩坑)

    Spring Cloud Hystrix 线程池队列配置(踩坑)

    这篇文章主要介绍了Spring Cloud Hystrix 线程池队列配置(踩坑),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • IDEA强制清除Maven缓存的方法示例

    IDEA强制清除Maven缓存的方法示例

    这篇文章主要介绍了IDEA强制清除Maven缓存的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Java实现计网循环冗余检验算法的方法示例

    Java实现计网循环冗余检验算法的方法示例

    这篇文章主要给大家介绍了关于Java实现计网循环冗余检验算法的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • SpringBoot注解@ConditionalOnClass底层源码实现

    SpringBoot注解@ConditionalOnClass底层源码实现

    这篇文章主要为大家介绍了SpringBoot注解@ConditionalOnClass底层源码实现,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02

最新评论