Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何解决服务之间的通信问题?

如何解决服务之间的通信问题?

作者头像
别团等shy哥发育
发布于 2023-02-25 07:49:17
发布于 2023-02-25 07:49:17
81500
代码可运行
举报
运行总次数:0
代码可运行

文章目录

1、如何解决服务之间的通信问题?

[1]HTTP REST方式 使用http协议进行数据传递 json格式数据 [2]RPC方式 远程过程调用 二进制数据 从OSI七层结构来讲,即物理层、数据链路层、网络层、运输层、会话层、表示层、应用层http属于应用层协议,而RPC属于传输层,所以RPC方式的传输效率比http高SpringCloud使用的是HTTP协议传递数据

2、如何在java代码中发起http方式请求?

spring框架提供HttpClient对象 使用RestTemplate发起一个http请求。

3、实现服务间通信的小案例

3.1 使用两个测试服务 用户服务users和订单服务orders

3.2 用户服务和订单服务都是两个独立的SpringBoot应用

3.3 两个服务都引入consul client依赖和健康检查依赖

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
		 <!--web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--consul client-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </dependency>

3.4 配置两个服务的application.properties

用户服务:(默认的服务名称就是Spring.application.name,所以可以不用指定)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
server.port=8888
spring.application.name=USERS

#consul server
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500

订单服务:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
server.port=9999
spring.application.name=ORDERS

#consul server
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500

3.5 在两个服务的入口类中加入服务注册client注解

用户服务

订单服务

3.6 控制器开发(这里进行服务提供者和服务消费者开发)

3.6.1 服务提供者(订单服务)

OrderController.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.baizhi.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Slf4j
public class OrderController {

    @GetMapping("order")
    public String demo(){
       log.info("order demo...");
        return "order demo OK!!!";
    }
}

3.6.2 服务消费者(用户服务)

UserController.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.baizhi.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
@Slf4j
public class UserController {

    @GetMapping("user")
    public String invokeDemo(){
         log.info("user demo...");
        //1、调用订单服务 服务地址:http://localhost:9999/order  必须是get方式 接收返回值String
        RestTemplate restTemplate = new RestTemplate();
        String orderResult = restTemplate.getForObject("http://localhost:9999/order", String.class);

        log.info("调用订单服务成功:{}",orderResult);

        return "调用order服务成功,结果为:"+orderResult;
    }
}

3.7 测试服务调用

在服务启动之后查看consul服务注册中心,可以看到用户服务和订单服务都注册成功了。关于consul服务注册与发现请看这篇文章:https://blog.csdn.net/qq_43753724/article/details/119820664?spm=1001.2014.3001.5501

访问http://localhost:9999/order测试订单服务:

访问用户服务(用户服务中会调用订单服务)

订单服务日志:(这里的第二次输出是因为被用户服务调用)

用户服务日志:

4、现有RestTemplate方式通信存在的问题?

  • 调用服务的路径主机和服务端口直接写死在url中无法实现服务集群时请求负载均衡
  • 调用服务的请求路径写死在代码中,日后提供服务路径发生变化时不利于后续维护工作。

5、解决RestTemplate负载均衡问题

  • 自定义负载均衡解决策略,但是这样无法实现服务健康检查切负载均衡策略过于单一
  • 使用SpringCloud提供的组件 推荐使用Ribbon来解决负载均衡的调用问题
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-08-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Spring Cloud LoadBalancer 的实战应用服务发现
Spring Cloud LoadBalancer 是 Spring Cloud 组件库中提供的一款服务负载均衡组件,它基于 Ribbon 实现了负载均衡的功能,为服务消费者提供了自动化的服务发现和负载均衡的能力。
堕落飞鸟
2023/04/15
6070
Ribbon负载均衡
文章目录 1、Ribbon基础知识 2、Ribbon服务调用 2.1 项目中引入依赖 2.2 查看consul client中依赖的ribbon 2.3 启动consul服务注册中心 2.4 将订单服务进行注册 2.5 将RestTemplate交给Spring工厂去管理 2.6 使用RestTemplate+ribbon进行服务调用 2.6.1 使用discovery client形式调用 2.6.2 使用LoadBalancerClient形式调用 2.6.3 使用 @LoadBalanced注解
别团等shy哥发育
2023/02/25
4080
Ribbon负载均衡
Spring Cloud构建微服务架构:服务消费(基础)【Dalston版】
前言通过上一篇《Spring Cloud构建微服务架构:服务注册与发现》,我们已经成功地将服务提供者:eureka-client或consul-client注册到了Eureka服务注册中心或Consul服务端上了,同时我们也通过DiscoveryClient接口的getServices获取了当前客户端缓存的所有服务清单,那么接下来我们要学习的就是:如何去消费服务提供者的接口? 使用LoadBalancerClient 在Spring Cloud Commons中提供了大量的与服务治理相关的抽象接口,包括Di
程序猿DD
2018/02/01
6030
SpringCloud-Consul注册中心
https://www.springcloud.cc/spring-cloud-consul.html
乐心湖
2020/07/31
5550
SpringCloud-Consul注册中心
Spring Cloud构建微服务架构:服务消费(Ribbon)【Dalston版】
前言通过上一篇《Spring Cloud构建微服务架构:服务消费(基础)》,我们已经学会如何通过LoadBalancerClient接口来获取某个服务的具体实例,并根据实例信息来发起服务接口消费请求。但是这样的做法需要我们手工的去编写服务选取、链接拼接等繁琐的工作,对于开发人员来说非常的不友好。所以,下来我们看看Spring Cloud中针对客户端负载均衡的工具包:Spring Cloud Ribbon。Spring Cloud Ribbon 客户端负载均衡工具包 Spring Cloud Ribbon是基
程序猿DD
2018/02/01
5760
Spring Cloud系列一:Eureka
如果做开发的现在说还没听过微服务,估计要失业了~。微服务中有很多生态,国内DUBBO框架用的较多,相对来说海外用Spring Cloud较多,不过近来Spring Cloud在国内普及程度越来越高,很多中小互联网公司都开始大量使用Spring Cloud。
心平气和
2021/02/26
3880
java架构之路-(微服务专题)ribbon的基本使用和内部算法的自我实现
  上次我们主要说了,我们的注册中心nacos的使用,如我们的命名空间、分组、集群、版本等是如何使用的,如果是这样呢?我们现在有三个用户服务和三个订单服务,我们应该如何分发这些请求呢?都请求到一个服务?轮询?权重?这次我们就来看一下我们的如何解决这些问题的。
小菜的不能再菜
2020/02/25
6500
java架构之路-(微服务专题)ribbon的基本使用和内部算法的自我实现
SpringCloud服务间通信方式
接下来在整个微服务架构中,我们比较关心的就是服务间的服务改如何调用,有哪些调用方式? 总结:在springcloud中服务间调用方式主要是使用 http restful方式进行服务间调用 1. 1基于
用户4283147
2022/10/27
5030
SpringCloud服务间通信方式
【SpringCloud】四、Eureka集群
Eureka Server的一个节点:http://eureka7002.com:7002/
Yuyy
2022/06/28
2310
【SpringCloud】四、Eureka集群
OpenFeign组件
Spring Cloud Feign是一个HTTP请求调用的轻量级框架,可以以Java接口注解的方式调用HTTP请求,而不用像Java中通过封装HTTP请求报文的方式直接调用。Feign通过处理注解,将请求模板化,当实际调用的时候传入参数,根据参数再应用到请求上,进而转化成真正的请求,这种请求相对而言比较直观。 Feign是一个声明式的伪Http客户端,它使得写Http客户端变得更简单。使用Feign,只需要创建一个接口并注解。它具有可插拔的注解特性(可以使用springmvc的注解),可使用Feign 注解和JAX-RS注解。Feign支持可插拔的编码器和解码器。Feign默认集成了Ribbon,默认实现了负载均衡的效果并且springcloud为feign添加了springmvc注解的支持。
别团等shy哥发育
2023/02/25
2840
OpenFeign组件
SpringCloud 微服务分布式 笔记(二)
微服务在消费远程API时总是使用本地缓存中的数据。 因此一般来说,即使Eureka Server发生宕机,也不会影响到服务之间的调用。
Java_慈祥
2024/08/06
1880
SpringCloud 微服务分布式 笔记(二)
微服务架构搭建:Consul+sleuth+zipkin+Feign/Ribbon+SpringConfig+Zuul+Hystrix Dash-Board-Turbine
springcloud微服务架构搭建:Consul+sleuth+zipkin+Feign/Ribbon+SpringConfig+Zuul+Hystrix Dash-Board-Turbine 相信现在已经有很多小伙伴已经或者准备使用springcloud微服务了,接下来为大家搭建一个微服务框架,后期可以自己进行扩展。会提供一个小案例: 服务提供者和服务消费者 ,消费者会调用提供者的服务,新建的项目都是用springboot,附源码下载,推荐使用coding地址下载,因为可以切换分支,后期可以及时更新。
用户2235302
2018/06/13
2.4K0
微服务注册中心Nacos入门
服务治理的核心由三部分组成:服务提供者、服务消费者、注册中心。在分布式系统架构中,每个微服务在启动时,将自己的信息存储在注册中心,叫做服务注册。服务消费者从注册中心获取服务提供者的网络信息,通过该信息调用服务,叫做服务发现。
Se7en258
2021/05/18
8050
微服务注册中心Nacos入门
sb2.0新版springcloud微服务实战:Consul+Zuul+Feign/Ribbon+Hystrix Turbine+Config+sleuth+zipkin
本篇文章是springboot2.x升级后的升级springcloud专贴,因为之前版本更新已经好久了,好多人评论可不可以出个新版本,大家一定要注意,这是springboot2.x版本的,springboot1.x的请参考 点击查看文章,基本组件都不变就是升级jar包版本,主要就是hystrix-dashboard使用有点变化。
用户2235302
2018/08/22
1.6K0
sb2.0新版springcloud微服务实战:Consul+Zuul+Feign/Ribbon+Hystrix Turbine+Config+sleuth+zipkin
Spring Cloud【Finchley】-04使用Ribbon实现客户端负载均衡
Spring Cloud-03将微服务注册到Eureka Server上 + 为Eureka Server添加用户认证中遗留的问题还记得吧 ,对,服务消费者调用服务提供者是硬编码的方式,虽然把地址配置到了application.yml中,但是一旦服务端的地址发生改变,那肯定是要修改配置文件的。
小小工匠
2021/08/17
5150
04Consul服务注册与发现
https://learn.hashicorp.com/tutorials/consul/get-started-install
Remember_Ray
2020/10/29
4070
04Consul服务注册与发现
Spring Cloud框架(原生Hoxton版本与Spring Cloud Alibaba)初级篇 ---- 服务注册与发现
步骤i同 将EurekaClient端8001注册进EurekaServer成为服务提供者provider !!!
百思不得小赵
2022/12/01
3710
Spring Cloud框架(原生Hoxton版本与Spring Cloud Alibaba)初级篇 ---- 服务注册与发现
SpringCloud 服务注册与发现
​ SpringCloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务治理。 在传统的 RPC 远程调用框架中, 管理每个服务与服务之间依赖关系比较复杂, 所以需要使用服务治理管理服务与服务之间依赖关系, 了以实现服务调用、 负载均衡、容错等, 实现服务发现与注册 。
OY
2022/03/17
7910
SpringCloud 服务注册与发现
springboot2新版springcloud微服务全家桶实战
本篇文章是springboot2.x升级后的升级springcloud专贴,因为之前版本更新已经好久了,好多人评论可不可以出个新版本,大家一定要注意,这是springboot2.x版本的,springboot1.x的请参考 点击查看文章,基本组件都不变就是升级jar包版本,主要就是hystrix-dashboard使用有点变化。还有一点要注意的是<font color="#dd0000">eureka已经宣布闭源</font>,目前使用的版本是稳定版,不影响使用,新项目建议大家使用consul或者zookeeper。
用户2235302
2018/08/10
7.4K0
springboot2新版springcloud微服务全家桶实战
微服务之间的通信的方式
RestTemplate是一个Http客户端,类似于HTTPClient,org但比HTTPClient更简单。我们通过RestTemplate来简单演示一下服务之间的调用,我们使用两个服务来做演示。一个商品服务,一个订单服务。首先创建一个商品服务工程:
端碗吹水
2020/09/24
9060
推荐阅读
相关推荐
Spring Cloud LoadBalancer 的实战应用服务发现
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验