什么是rpc
rpc即是远程过程调用,简单来说就是调用其他服务的接口像调用自己的本地方法一样,通常我们的调用的时候不需要关心调用过程和底层的通信即可实现调用其他的服务;
大概流程就是服务模块双方都会向注册中心注册自己的服务,然后work1客户端会通过代理proxy调用服务端,具体调用哪个服务,这里就是注册中心的用处了,work2接收到请求处理然后返回,
为什么要用rpc
随着我们服务的模块化,不可避免的会存在各个服务之间的调用问题,那么服务之间无感、方便快捷、并且还可以进行一些特殊的设定那当然最好,于是乎rpc出现了;
写个RPC--版本选择
本篇着重的技术点是nacos+openfeign实现rpc调用(基于HTTP),本文不会很复杂的,只是个大概,后续可能会写上基于Dubbo的实现(基于TCP),以及序列化可能存在的问题(数据在传输过程需要序列化以及反序列化,这其中数据可能会丢失);
写rpcDemo的时候一定要注意引入包的版本号,不然就会一直报错,这里贴上阿里的版本对应关系地址,方便大家下去查询,spring-cloud-alibaba;我用的是Spring Cloud Alibaba 2021.1的版本,自然我的springboot版本就要是2.4.2;网页下面还有组件的关系,大家可以自行看下,这个demo没用到;
[图片上传失败...(image-4dc35a-1669798085381)]
在我们为父pom指定版本号的时候要为其加上dependencyManagement标签,看下子模块pom是否声明了父模块,即parent标签;这样我们的子模块就可以依赖继承父模块版本号了;详细的可以看提交的代码;
写个RPC--代码开发
下面我们正式开发,首先我们需要建立一个api包(我这里是测试用例所以用common包代替),该模块我们只需要定义需要的接口,看用例:
@FeignClient(name = "应用名")
@RequestMapping("/getUser")
public interface UserInfoService {
@GetMapping("/getMess")
String UserMess(@RequestParam("name") String name);
}
复制代码
此处类上面的接口地址你可以直接和方法上的地址拼接在一起或者分开,都可,但是必须加上
@FeignClient注解,有了该注解表示这个接口可以实现远程调用,其中里面的参数表示服务提供者的名称,即applicationName;
接着我们要创建三个模块,一个当客户端发送请求,两个当服务端处理请求,
先说客户端
首先我们客户端由于引入了新的模块,所以我们需要让我们的feign接口能被spring扫描到,启动类添加上这两个注解,@EnableDiscoveryClient表示该客户端可被发现,默认为true,表示服务自动注册;
@EnableDiscoveryClient
@EnableFeignClients(basePackages = "com",defaultConfiguration = OpFeignConfig.class)
复制代码
接着我们在controller中调用这个service接口即可,呃呃呃,就是这么简单吧(先实现功能)
@RestController
@RequestMapping("/getUser")
public class UserInfoController {
@Autowired
private UserInfoService userInfoService;
@GetMapping("/getMessd")
public String getUserMessd(@RequestParam("name") String name){
String tName = userInfoService.UserMess(name);
return tName;
}
}
复制代码
再说服务端
服务端就更简单啦,我们这里只拿一个出来说下,由于我们是被调用方,我们只需要该服务可被注册发现即可,所以启动类只需要加上@EnableDiscoveryClient;这里面就不需要调用api对应的service接口了,我们直接将我们的controller层接口与我们的service层接口对应上即可,届时我们的客户端会根据service上的接口去找服务端对应的接口;看用例:
@RestController
@RequestMapping("/getUser")
public class UserInfoController {
@GetMapping("/getMess")
public String getUserMess(@RequestParam("name") String name){
System.out.println(name);
return "我的名字是8008:"+name;
}
}
复制代码
额,简单实现功能就是这么简单;
接着我们看下bootstrap.yaml;此处我只配了集群所需要的服务名及group;
spring:
application:
name: 服务名(与feignclient的name对应)
cloud:
nacos:
discovery:
server-addr: xxx:8848 #Nacos地址
group: my-test
config:
server-addr: xxx:8848 #Nacos地址
file-extension: yaml #这里我们获取的yaml格式的配置
复制代码
application.yaml加上下面这个,
feign:
httpclient:
enabled: true
max-connections: 100
复制代码
可以不配置,默认就是true,具体在源码有体现
[图片上传失败...(image-bffc7e-1669798085381)]
至于启动我这里就不过多展示了,有需要可以自行下载demo了解,最终nacos可以看到这样的情况;
[图片上传失败...(image-a5aa8e-1669798085381)]
代码已上传码云;看一千遍不如动手一遍;
作者:少年不想说话
链接:https://juejin.cn/post/7169462864795664415
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。