这是我参与「第五届青训营」伴学笔记创作活动的第14天。
前言
在青训营前面的课程中,我们认识了互联网项目架构的演变,因而对于我们目前主流的微服务架构和分布式系统也有了一定的认识。今天的课程主要是学习RPC框架,讲的是字节内部使用的kitex,毕竟字节的主要语言是Go,因此这方面的内容课堂上和课后资料已经讲了很多,我就不多赘述了,我主要回顾下自己曾使用过的一个Java的RPC框架Dubbo(已停止维护)。
笔记内容
1.Dubbo的概念
Dubbo是阿里巴巴公司开源的一个高性能、轻量级的 Java RPC 框架,它致力于提供高性能和透明化的 RPC远程服务调用方案,以及 SOA 服务治理方案。
从使用目的来看,dubbo和kitex的目标是一致的,都是为了提供高效的RPC远程调用服务。
2.Dubbo的架构
Provider:暴露服务的服务提供方
Container:服务运行容器
Consumer:调用远程服务的服务消费方
Registry:服务注册与发现的注册中心
Monitor:统计服务的调用次数和调用时间的监控中心
3.Dubbo快速入门
3-1.引入相关的Maven配置
其他spring和servlet相关的配置就不贴在这里了,根据自己需要去添加即可。
<!--Dubbo的起步依赖,版本2.7之后统一为rg.apache.dubb -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
</dependency>
<!--ZooKeeper客户端实现 -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>${zookeeper.version}</version>
</dependency>
<!--ZooKeeper客户端实现 -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>${zookeeper.version}</version>
</dependency>
3-2.创建服务提供者Provider模块
在服务提供者模块编写UserServiceImpl类中提供服务,当然,不能忘记先定义接口。
package com.cc.service;
public interface UserService {
public String sayHello();
}
package com.cc.service.impl;
import com.cc.service.UserService;
import org.apache.dubbo.config.annotation.Service;
@Service
public class UserServiceImpl implements UserService {
public String sayHello() {
return "hello dubbo hello!~";
}
}
3-3.创建服务消费者Consumer模块
需要在服务消费者中的UserController远程调用UserServiceImpl提供的服务。
package com.cc.controller;
import com.cc.service.UserService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/user")
public class UserController {
@Reference//远程注入
private UserService userService;
@RequestMapping("/sayHello")
public String sayHello(){
return userService.sayHello();
}
}
3-4.分别启动两个服务,测试
两个服务启动之后,通过浏览器访问本地的8000端口就可以看到服务正常运行了:
小结
RPC框架的原理和架构都大同小异。因此,我们在学习RPC框架时的重点应放在这个框架的设计以及调用过程,而不应该在它的语言上纠结太多。毕竟,语言只是工具,但思想是通用的,掌握正确的思想,就可以举一反三。当然,dubbo也具有一些kitex具有的高级特性,如:地址缓存、超时与重试、负载均衡等,尽管他已经被nacos所取代,但仍具有学习意义。