建设网站目的是什么,canva可画ppt模板,公司做分享网站好吗,定制网站开发广安广播电台在 Spring Cloud 中#xff0c;主要有以下几种通信方式#xff1a;
一、基于 HTTP 的 RESTful API 工作原理#xff1a; 这是一种常见的通信方式#xff0c;各个微服务通过发送 HTTP 请求来相互调用。服务提供者暴露 RESTful API 接口#xff0c;服务消费者通过 HTTP 客户…在 Spring Cloud 中主要有以下几种通信方式
一、基于 HTTP 的 RESTful API 工作原理 这是一种常见的通信方式各个微服务通过发送 HTTP 请求来相互调用。服务提供者暴露 RESTful API 接口服务消费者通过 HTTP 客户端如RestTemplate、Feign等发送请求。 例如一个订单服务需要查询商品信息它可以通过 HTTP 请求调用商品服务提供的 API 接口。 优点 简单易用基于广泛使用的 HTTP 协议开发人员熟悉度高。 与语言无关不同语言实现的微服务可以方便地进行通信。 可以利用 HTTP 的各种特性如缓存、认证、授权等。 缺点 相对来说性能可能不如其他通信方式因为 HTTP 协议有一定的开销。 对于高性能、低延迟的场景可能不太适合。
二、基于 RPCRemote Procedure Call的通信 以 Dubbo 在 Spring Cloud 中的应用为例 Dubbo 是一个高性能的 RPC 框架可以与 Spring Cloud 集成。通过 Dubbo服务提供者和服务消费者之间可以进行高效的远程方法调用。 例如使用 Dubbo 时服务提供者将服务注册到注册中心服务消费者从注册中心获取服务提供者的地址列表然后通过 RPC 调用服务提供者的方法。 优点 性能高通常比基于 HTTP 的通信方式更快。 可以支持多种序列化方式如 Hessian、JSON、Protobuf 等满足不同场景的需求。 缺点 相对复杂需要引入额外的框架和依赖。 与特定的 RPC 框架绑定可能会限制技术选型的灵活性。 三、消息队列Message Queue 工作原理 各个微服务通过发送和接收消息来进行通信。服务生产者将消息发送到消息队列服务消费者从消息队列中获取消息并进行处理。 例如一个订单服务在订单创建成功后将订单信息发送到消息队列库存服务从消息队列中获取订单信息并进行库存扣减操作。 优点 解耦服务之间的直接依赖提高系统的可扩展性和容错性。 可以实现异步通信提高系统的响应速度和吞吐量。 缺点 引入了额外的中间件增加了系统的复杂性。 需要处理消息的顺序性、重复消费等问题。 总之Spring Cloud 中可以根据具体的业务需求和场景选择合适的通信方式。HTTP 的 RESTful API 简单易用适合大多数场景RPC 通信性能高适合对性能要求较高的场景消息队列适合解耦和异步通信的场景。 四、基于 HTTP 的 RESTful API的实现
一、主要有两种 RestTemplate 方式 Feign 的方式
二、RestTemplate 方式 RestTemplate 中也分为三种方式 简单来演示一下吧 第一种方式 直接使用 RestTemplate url 写死 服务端编写 /** 用来测试与 order 服务的连接 author ccyang date 2018/7/1 16:06 */ RestController public class serverController { GetMapping(“/getMsg”) public String getMsg(){ return “this is product’ msg”; } }
客户端编写 /*** author ccyang* date 2018/7/1 16:13*/RestControllerSlf4jpublic class clientController {GetMapping(/getProductMsg)public String getProductMsg(){RestTemplate restTemplate new RestTemplate();String response restTemplate.getForObject(http://localhost:8080/getMsg,String.class);log.info(response {} , response);return response;}}
然后去访问 http://localhost:8080/getMsg 即可。 因为服务端的 api 被硬编码在客户端因此有两个缺点 – 当注册中心有很多服务时我们可能不知道我们需要的服务由谁提供、api是多少因此就可能无法调用到服务。 –当某个服务部署了多个例如 api 是 “localhost:9080/getMsglocalhost:9081/getMsg “那么此时就需要负载均衡这种硬编码显然不符合场景。 第二种方式 service端代码依旧客户端通过 LoadBalancerClient 来获取应用名进而获取地址和端口在格式化拼接地址从而调用 product服务。如下 /** 测试获取 product服务的msg author ccyang date 2018/7/1 16:13 */ RestController Slf4j public class clientController { Autowired private LoadBalancerClient loadBalancerClient; GetMapping(“/getProductMsg”) public String getProductMsg(){ RestTemplate restTemplate new RestTemplate();ServiceInstance serviceInstance loadBalancerClient.choose(PRODUCT); // serviceId 为提供服务的应用名String url String.format(http://%s:%s,serviceInstance.getHost(),serviceInstance.getPort() /getMsg);String response restTemplate.getForObject( url, String.class);log.info(response {} , response);return response;123456 } } 缺点是每次调用服务都要这样写编码很麻烦。 第三种方式 通过 LoadBalanced可在restTemplate 直接使用应用名字。 Component public class RestTemplateConfig { Bean LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); } } RestController Slf4j public class clientController { Autowiredprivate RestTemplate restTemplate;GetMapping(/getProductMsg)public String getProductMsg(){String response restTemplate.getForObject( http://PRODUCT/getMsg, String.class); // 通过应用名进行访问log.info(response {} , response);return response;}12345678910 }
三、使用 Feign 的方式进行通信 声明式 REST客户端伪 RPC 采用了基于接口的注解
先看看如何使用 Feign: \1. 添加依赖 !-- add feign , note: must add version --dependencygroupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-feign/artifactIdversion1.4.4.RELEASE/version/dependency2. 添加注解到主类上EnableFeignClients3. 定义要调用的接口FeignClient(name product) // 服务名public interface ProductClient {GetMapping(/getMsg) // 这里要和 Product服务提供的接口一致String productMsg();}4. 在该使用的地方使用注解中提供的方法RestControllerSlf4jpublic class clientController {Autowiredprivate ProductClient productClient; // 有报错不影响GetMapping(/getProductMsg)public String getProductMsg(){String response productClient.productMsg();log.info(response {} , response);return response;}}
Feign 可以看做是一个伪 RPC而且HTTP远程调用对开发者完全透明。 RestTemplate 内部使用 Ribbon做负载均衡 Feign 内部也是使用的Ribbon做负载均衡 参考springCloud 服务间的两种通信方式_springcloud项目之间是如何通信的-CSDN博客