一起来学SpringCloud之服务间调用

简介: 一起来学SpringCloud之服务间调用

微信截图_20230209163713.png


前言

大家好,一直以来我都本着用最通俗的话理解核心的知识点, 我认为所有的难点都离不开 基础知识 的铺垫。目前正在出一个SpringCloud长期系列教程,从入门到进阶, 篇幅会较多~


适合人群

  • 有一定的Java基础
  • 想尝试微服务开发
  • 有SpringBoot开发基础
  • 想学习或了解SpringCloud
  • 想提高自己的同学

大佬可以绕过 ~


背景

如果你是一路看过来的,很高兴你能够耐心看完。之前带大家学了Springboot这门框架,熟练掌握了单体应用的开发,如今微服务开发盛行,对我们的技术要求也是越来越高,薪资也是令人兴奋。这个系列将会带大家学习SpringCloud微服务开发,我会带大家一步一步的入门,耐心看完你一定会有收获~


情景回顾

上期带大家一起认识了Nacos以及带大家体验了一下它作为配置中心和注册中心的使用,本期就带大家结合注册中心来进行服务的远程调用,首先学习一下基于rest的远程调用RestTemplate,我们一起来看一下吧~


配置 RestTemplate

先配置一下它,其实RestTemplate并不是Cloud的产物,它在org.springframework.web.client下的一个类,也就是说我们的单体应用比如单独的SpringBoot也可以用的,我们可以用它去进行http请求调用

@Configuration
public class RestTemplateConfig {
    @Bean
    public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
        return new RestTemplate(factory);
    }
    @Bean
    public ClientHttpRequestFactory clientHttpRequestFactory() {
        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
        factory.setReadTimeout(6000);
        factory.setConnectTimeout(3000);
        return factory;
    }
}
复制代码


RestTemplate常用方法讲解

为了方便测试,我们在项目中新增两个模块,一个是consumer一个是producer,项目大家自己建,同样需要把服务注册到 Nacos中, RestTemplateConfig放到consumer中,因为它是调用端


producer

producer下新建一个HelloController

@RestController
@RequestMapping("/hello")
public class HelloController {
    @GetMapping("/app/{id:\\d+}")
    @ResponseBody
    public String hello1(@PathVariable String id) {
        return "hello " + id;
    }
    @PostMapping("/app/post")
    @ResponseBody
    public User hello2(@RequestBody User u) {
        return u;
    }
}
复制代码


  • User 类
@Data
public class User {
    private String username;
}
复制代码


consumer

同样的,我们也新建一个HelloController, 我们之前讲过,我们直接使用ip+port的方式也是可以直接调用的,但是我们有更好的方案,那么如何去结合注册中心使用呢?让我们直接可以通过服务名就可以调用呢?这里我们只需要改一下RestTemplateConfig,只需要加一个@LoadBalanced的注解就可以了

@Bean
    @LoadBalanced // 这样可以使用服务对象调用  http://provicer/app/hello
    public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
        return new RestTemplate(factory);
    }
复制代码


如果我想知道服务地址是啥,有什么办法可以拿到吗?我们这里可以通过服务发现获取服务提供者的信息

@GetMapping("/discoverSvrInfo")
    @ResponseBody
    public URI getSvrUrl() throws Exception {
        // 如果是多个服务提供者
        ServiceInstance serviceInstance;
        if(true) {
            List<ServiceInstance> services = discoveryClient.getInstances("provider");
            serviceInstance = services.size() > 0 ? services.get(0) : null;
        }else {
            serviceInstance = loadBalancerClient.choose("provider");
        }
        // 发起调用
        // 1. 不同命名空间下 调用,会导致找不到实例
        if(serviceInstance == null) {
            throw new Exception("未获取到实例");
        }
        return serviceInstance.getUri();
    }
复制代码

大家可以自己打断点,看看里边都有些啥。有了基本的认识之后,下边我们就来整一下吧


发起 GET 请求

  • 通过实体类
@RequestMapping("/hello/user/{id:\\d+}")
@ResponseBody
public User hello1(@PathVariable String id) {
    User u = restTemplate.getForEntity("http://provider/hello/app/{name}", User.class, id).getBody();
    return u;
}
复制代码


  • 通过Map
Map<String, Object> params = new HashMap<>();
params.put("name", id);
u = restTemplate.getForEntity("http://provider/hello/app/{name}", User.class, params).getBody();
复制代码


发起 POST 请求

Map<String, String> us = new HashMap<>();
us.put("username", "java rest api -- ");
us.put("username", us.get("username") + id);
u = restTemplate.postForObject("http://provider/hello/app/post", us, User.class);
复制代码

同样的,它也有 postForObject  postForEntity  postForLocation, 方法跟get方式类似, 大家可以自己试一下


结束语

本期到这里就结束了, 总结一下,本节主要讲了,服务之间如何进结合服务发现机制进行调用,我们通过基于rest方式的调用,学习了restTemplate的用法,最后完成了一个小例子,建议大家自己多去尝试 ~


下期预告

我们说虽然服务被拆分开, 但是还会产生问题的,想象一下多个微服务之间进行调用, 你能保障服务就不会出现问题吗,如果出现问题了,会产生什么后果❓ 会影响其它服务吗,想必肯定是的。这就是我们下期要讲的另一个核心组件Hystrix。 关注我,不迷路, 下期不见不散 ~

相关文章
|
1月前
|
负载均衡 算法 Java
【SpringCloud(4)】OpenFeign客户端:OpenFeign服务绑定;调用服务接口;Feign和OpenFeign
Feign是一个WebService客户端。使用Feign能让编写WebService客户端更加简单。 它的使用方法是定义一个服务接口然后再上面添加注解。Feign也支持可拔插式的编码器和解码器。SpringCloud对Feign进行了封装,十七支持了SpringMVC标准注解和HttpMessageConverters。 Feign可用于Eureka和Ribbon组合使用以支持负载均衡
631 138
|
3月前
|
监控 Java API
Spring Boot 3.2 结合 Spring Cloud 微服务架构实操指南 现代分布式应用系统构建实战教程
Spring Boot 3.2 + Spring Cloud 2023.0 微服务架构实践摘要 本文基于Spring Boot 3.2.5和Spring Cloud 2023.0.1最新稳定版本,演示现代微服务架构的构建过程。主要内容包括: 技术栈选择:采用Spring Cloud Netflix Eureka 4.1.0作为服务注册中心,Resilience4j 2.1.0替代Hystrix实现熔断机制,配合OpenFeign和Gateway等组件。 核心实操步骤: 搭建Eureka注册中心服务 构建商品
674 3
|
人工智能 Java Serverless
【MCP教程系列】搭建基于 Spring AI 的 SSE 模式 MCP 服务并自定义部署至阿里云百炼
本文详细介绍了如何基于Spring AI搭建支持SSE模式的MCP服务,并成功集成至阿里云百炼大模型平台。通过四个步骤实现从零到Agent的构建,包括项目创建、工具开发、服务测试与部署。文章还提供了具体代码示例和操作截图,帮助读者快速上手。最终,将自定义SSE MCP服务集成到百炼平台,完成智能体应用的创建与测试。适合希望了解SSE实时交互及大模型集成的开发者参考。
12019 60
|
1月前
|
负载均衡 Java API
《深入理解Spring》Spring Cloud 构建分布式系统的微服务全家桶
Spring Cloud为微服务架构提供一站式解决方案,涵盖服务注册、配置管理、负载均衡、熔断限流等核心功能,助力开发者构建高可用、易扩展的分布式系统,并持续向云原生演进。
|
4月前
|
Prometheus 监控 Cloud Native
Docker 部署 Prometheus 和 Grafana 监控 Spring Boot 服务
Docker 部署 Prometheus 和 Grafana 监控 Spring Boot 服务实现步骤
521 0
|
存储 数据可视化 Java
基于MicrometerTracing门面和Zipkin实现集成springcloud2023的服务追踪
Sleuth将会停止维护,Sleuth最新版本也只支持springboot2。作为替代可以使用MicrometerTracing在微服务中作为服务追踪的工具。
617 2
|
8月前
|
人工智能 自然语言处理 Java
对话即服务:Spring Boot整合MCP让你的CRUD系统秒变AI助手
本文介绍了如何通过Model Context Protocol (MCP) 协议将传统Spring Boot服务改造为支持AI交互的智能系统。MCP作为“万能适配器”,让AI以统一方式与多种服务和数据源交互,降低开发复杂度。文章以图书管理服务为例,详细说明了引入依赖、配置MCP服务器、改造服务方法(注解方式或函数Bean方式)及接口测试的全流程。最终实现用户通过自然语言查询数据库的功能,展示了MCP在简化AI集成、提升系统易用性方面的价值。未来,“对话即服务”有望成为主流开发范式。
6100 7
|
8月前
|
负载均衡 Dubbo Java
Spring Cloud Alibaba与Spring Cloud区别和联系?
Spring Cloud Alibaba与Spring Cloud区别和联系?
下一篇
oss云网关配置