开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情
👨🎓作者:生无clean
🙏版权声明:文章里的部分文字或者图片来自于互联网以及百度百科,如有侵权请尽快联系小编。
☠️每日毒鸡汤:好的容貌和很多钱,是进入上流社交活动的通行证。
Dubbo是一套PRC框架。既然是框架,我们可以在框架结构高度,定义Dubbo中使用的通信协议,使用的序列化框架技术,而数据格式由Dubbo定义,我们负责配置之后直接通过客户端调用服务端代码。
简单来说,Dubbo是PRC概念的实现。
1. Dubbo使用方式
1.1 Dubbo直连方式
- 所谓的直连方式就是在服务提供者和服务消费者进行交互的时候不需要将服务注册到注册中心中,直接进行连接提供服务。
dubbo所需要的依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.12</version>
</dependency>
实体类
@Date
// 注意:这里必须实现序列化接口,因为在分布式中传输是按照二进制的形式,必须指定序列化方式
public class AlarmConfig implements Serializable {
private Integer id;
private String name;
private Integer age;
}
1.1.1 服务提供者
- 服务提供者:提供一个接口供服务消费者进行使用。
public interface UserService {
/**
* 根据用户表示来获取用户信息
*/
User queryUserById(Integer id);
}
@Service
public class UserServiceImpl implements UserService {
/**
* 根据用户标识查询用户信息
*/
@Override
public User queryUserById(Integer id) {
User user = new User();
user.setAge(20);
user.setName("张三");
user.setId(id);
return user;
}
}
- 服务提供者:添加服务提供者的配置文件。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<!-- 服务提供者声明名称:必须保证服务名称的唯一性,它的名称是 dubbo 内部使用的唯一标识 -->
<dubbo:application name="001-link-userservice-provider "/>
<!--
访问服务协议的名称及端口号,dubbo官方推荐使用的是dubbo协议,端口号默认为 20880
name:指定协议的名称
port:指定协议的端口号(默认为:20880)
-->
<dubbo:protocol name="dubbo" port="20880"/>
<!--
暴露服务接口
interface:指定提供服务接口的路径信息
ref:接口引用的实现类在 spring 容器中的标识
registry:指定时候使用注册中心,N/A标识不使用注册中心
-->
<dubbo:service interface="com.yunbocheng.server.UserService" ref="userService" register="N/A"/>
<!--
将接口的实现类加载到 spring 容器中
id:该服务接口的实现类注入到 spring 容器中的的唯一标识
class:指定该实现接口的路径
-->
<bean id="userService" class="com.yunbocheng.server.impl.UserServiceImpl"/>
</beans>
1.1.2 服务消费者
- 既然是分布式架构,那么肯定不是在一个模块中进行使用的,服务消费者和服务生产者相当于是两个独立分服务,他们在打包、部署的时候彼此独立,但是他们之间又通过某种方式进行相互依赖。
- 服务消费者既然要使用服务生产者中的服务,那么就需要将服务生产者打成一个jar包然后将这个jar包注入到服务消费者中,这样服务消费者才可以获取到生产者的服务进行使用。
- 服务消费者不仅要引入spring的依赖以及Dubbo依赖,还需要额外引入服务生产者打包成的jar包。
服务消费者:服务消费者的配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<!-- 声明服务消费者的名称:必须保证服务名称的唯一性,它的名称是 dubbo 内部使用的唯一标识 -->
<dubbo:application name="001-link-userservice-consumer "/>
<!--
引用远程服务接口:
id:远程服务接口对象名称
interface:调用远程接口的全限定类名
url;访问服务接口的地址
registry:不使用注册中心,值为: N/A
-->
<dubbo:reference id="userService"
interface="com.yunbocheng.server.UserService"
url="dubbo://localhost:20880"
reconnect="N/A"/>
</beans>
服务消费者:直接使用远程调用模块中的服务。
@Autowired
private UserService userService;
@RequestMapping(value = "/user")
public String userDetail(Model model , Integer Id){
// 直接调用远程服务,根据id去查询指定的用户信息
User user = userService.queryUserById(id);
model.addAttribute("user",user)l
return "userDetail"
}
重点:
- 单纯的按照上面的步骤还是不够的,既然使用的是 RPC 框架,那么消费者就应该不能直接获取到提供者接口的实现类,只能获取到提供者的接口,所以次数就需要一个分包的过程,也就是把服务接口、服务模型等均放在共包中,然后让消费者去调用这个包中的接口,而不直接去获取提供者的接口。