springcloud 远程rpc调用接口

SpringCloud微服务RPC调用
本文介绍如何在SpringCloud微服务架构下,利用RestTemplate和Eureka注册中心实现服务间RPC远程调用。通过创建OrderController并注入RestTemplate,演示了如何调用注册在Eureka上的Member微服务。

springcloud 如果想要从注册中心中调用已经注册的接口,需要用如下方法。

我们现在已经将一个微服务注册到了注册中心。端口是8083的那个
在这里插入图片描述

并且里面有个member的RequestMapping
在这里插入图片描述
首先,创建一个微服务,将需要的依赖放入pom.xml和配置好appplication.yml

然后我们就要在一个controller中用rpc通过注册中心调用接口
创建一个ordercontroller.java

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class ordercontroller {
	@Autowired
	private RestTemplate restTemplate;

	@RequestMapping("getorder")
	public String getorder() {
		// order 使用rpc 远程调用技术
		String memberUrl = "http://app-itmayiedu-member/member";
		String result = restTemplate.getForObject(memberUrl, String.class);
		System.out.println(result);
		return result;
	}

}

并且创建一个启动文件,我创的是app.java

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
@EnableEurekaClient
public class app {

	public static void main(String[] args) {
		SpringApplication.run(app.class, args);
	}

	@Bean
	@LoadBalanced
	RestTemplate restTemplate() {
		return new RestTemplate();
	}

}

这里的LoadBalanced是开启负载均衡一定要加上

然后即可调用到8083端口的接口
在这里插入图片描述
成功

<think>我们正在比较Spring Cloud和Dubbo在接口调用方面的区别。根据提供的引用内容,我们可以总结以下几点: 1. **通信协议**:-Dubbo:基于RPC远程过程调用),通常使用自定义的Dubbo协议(默认是dubbo协议,基于TCP),性能较高,但跨语言支持相对较弱(虽然Dubbo支持多语言,但需要额外的适配)。- SpringCloud:基于HTTP协议的RESTfulAPI,使用HTTP/HTTPS协议,通常使用JSON/XML作为数据交换格式,因此跨语言支持更好,因为HTTP是通用标准。 2. **服务发现**:- Dubbo:需要配合Zookeeper、Nacos等注册中心进行服务发现。- SpringCloud:通常使用Eureka、Consul、Nacos等作为注册中心,服务间通过服务名进行调用。3.**接口调用的实现方式**:-Dubbo:通过定义接口(JavaInterface),在服务提供方实现接口,在消费方通过注入接口的代理对象进行调用调用看起来像本地调用一样(但实际是远程调用)。-Spring Cloud:通过定义RESTful接口,服务消费方使用RestTemplate、Feign或WebClient等HTTP客户端来调用服务提供方的接口(URL形式)。 4. **服务治理**:- Dubbo:内置了丰富的服务治理功能,如负载均衡、服务降级、流量控制等。- SpringCloud:这些功能需要借助Netflix OSS等组件(如Ribbon、Hystrix)或者Spring CloudAlibaba(如Sentinel)来实现,但Spring Cloud生态中这些组件都是可选的,并且可以灵活组合。 5. **扩展性**:-Dubbo:设计上高度可扩展,用户可以通过扩展接口实现自定义的拦截器、过滤器等。-Spring Cloud:基于Spring Boot的自动配置和起步依赖,扩展性也很好,并且可以方便地集成Spring生态的其他组件。6.**文档和社区**:-Dubbo:作为国产框架,中文文档丰富,国内社区活跃。- SpringCloud:作为Spring生态的一部分,有全球性的社区支持,文档丰富(英文为主,但中文资料也逐渐增多)。根据引用[1]和引用[2]的内容,我们可以进一步明确: -Dubbo是一款RPC服务开发框架,主要用于解决微服务架构下的服务治理与通信问题。它让微服务之间具备远程地址发现与通信能力,并提供服务治理特性(引用[2])。- SpringCloud则是一套微服务解决方案的集合,它基于HTTPRESTful调用,并且可以集成Dubbo来实现RPC调用(引用[2]和引用[3]),说明两者并非互斥,而是可以结合使用。因此,在接口调用上的主要区别可以归纳为:- **Dubbo**:使用RPC,性能更高,但需要依赖特定的接口定义(Java接口),调用方式为本地方法式调用(代理对象)。 -**SpringCloud**:使用HTTP REST,通用性更好,跨语言支持更佳,调用方式为HTTP请求(如通过Feign声明的接口或RestTemplate发送HTTP请求)。此外,引用[1]提到,Dubbo的发展方向是积极适应SpringCloud生态,这意味着两者可以协同工作。例如,可以在SpringCloud项目中使用Dubbo作为RPC框架(通过Spring CloudAlibaba Dubbo组件)。 总结表格: |特性|Dubbo| SpringCloud| |--------------|--------------------------------------------|--------------------------------------------||通信协议|自定义RPC协议(如dubbo协议),基于TCP| HTTP(RESTful),基于文本(JSON/XML)| |调用方式|通过接口代理,像本地方法一样调用|通过HTTP客户端(如Feign)发送HTTP请求| |服务发现|依赖注册中心(Zookeeper, Nacos等)|依赖注册中心(Eureka, Consul,Nacos等)||跨语言支持|需要多语言SDK(支持但可能需额外适配)|天然支持(HTTP标准)| |性能|较高(二进制传输,序列化效率高)|相对较低(文本传输,序列化开销大)| |服务治理|内置丰富|需要集成其他组件(如Hystrix, Ribbon)||扩展性|高度可扩展|基于SpringBoot,扩展性好| |社区和文档|国内社区活跃,中文文档丰富|全球社区,英文文档为主(但中文资料也不少)| 相关问题:1.在微服务架构中,如何选择使用Dubbo还是Spring Cloud进行服务间通信? 2. Dubbo和Spring Cloud在服务治理方面有哪些具体的功能差异? 3.能否在同一个项目中同时使用Spring Cloud和Dubbo?如何实现?</think>### Spring Cloud与Dubbo在接口调用上的区别 #### 1. **通信协议与调用方式** - **Dubbo**: 基于**RPC远程过程调用)协议**(默认使用TCP长连接),通过**接口代理**实现调用。服务提供方暴露Java接口,消费方通过接口代理对象直接调用远程方法,形式上类似本地调用。 示例: ```java // 消费方直接调用接口方法 UserService userService = proxyFactory.getProxy(UserService.class); User user = userService.getUserById(1); ``` - **Spring Cloud**: 基于**HTTP RESTful API**(通常使用JSON/XML),通过**HTTP客户端**(如Feign、RestTemplate)发起请求。调用需明确指定URL和参数,本质是HTTP请求。 示例(Feign): ```java @FeignClient(name = "user-service") public interface UserService { @GetMapping("/users/{id}") User getUserById(@PathVariable("id") int id); } ``` #### 2. **跨语言支持** - **Dubbo**: 原生对**非Java语言支持较弱**(需通过多语言SDK适配),主要面向Java生态[^2]。 - **Spring Cloud**: HTTP协议具有**天然跨语言性**,任何支持HTTP的客户端(Python、Go等)均可调用,更适合异构系统[^1]。 #### 3. **服务发现机制** - **Dubbo**: 依赖**注册中心**(如Zookeeper、Nacos)动态发现服务地址,但调用时仍需通过接口代理。 - **Spring Cloud**: 同样需注册中心(如Eureka、Nacos),但调用时通过**服务名+URL路径**定位接口(如`http://user-service/users/1`)。 #### 4. **性能与效率** - **Dubbo**: RPC协议(二进制序列化)**性能更高**,适合高并发、低延迟场景[^2]。 - **Spring Cloud**: HTTP协议(文本序列化)有额外开销,性能略低,但可通过HTTP/2优化。 #### 5. **扩展性与治理能力** - **Dubbo**: 内置**丰富治理特性**(负载均衡、熔断、流量控制),高度可扩展[^2]。 ```java // 通过@Reference注解配置治理策略 @Reference(loadbalance = "roundrobin", timeout = 1000) private UserService userService; ``` - **Spring Cloud**: 治理能力依赖**组件组合**(如Ribbon负载均衡、Hystrix熔断),灵活性高但需额外配置[^1]。 #### 6. **适用场景** - **Dubbo**: 适合**纯Java技术栈**、对性能要求高的微服务集群。 - **Spring Cloud**: 适合**多语言混合**、需与云原生生态(如Kubernetes)集成的系统。 #### 总结对比表 | **特性** | **Dubbo** | **Spring Cloud** | |------------------|-------------------------|--------------------------| | 协议 | RPC(TCP) | HTTP RESTful | | 调用方式 | 接口代理 | HTTP客户端 | | 跨语言支持 | 弱(需SDK适配) | 强(标准HTTP) | | 性能 | 高(二进制序列化) | 中(文本序列化) | | 服务治理 | 内置丰富 | 依赖组件组合 | | 典型应用场景 | Java高并发系统 | 多语言混合云原生架构 | --- ### 相关问题 1. **Dubbo如何实现与Spring Cloud的集成?** > 引用[2]提到可通过`Spring Cloud Alibaba Dubbo`组件实现RPC调用[^2]。 2. **在微服务架构中,何时选择RPC而非HTTP?** > 需权衡性能、语言兼容性和技术栈统一性。 3. **Dubbo的接口调用在服务治理方面有哪些独特优势?** > 如动态配置负载均衡策略、熔断阈值等[^2]。 4. **Spring Cloud的Feign客户端如何简化HTTP调用?** > 通过注解声明接口,自动处理请求映射和序列化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值