Java分布式框架dubbo教程
目标
集群和分布式
集群:很多“人”一起,干一样的事
一个业务模块,部罢在多台服务器上
分布式:很多“人”一起,干不一样的事。这些不一样的事,合起来是一件大事
一个大的业务系统,拆分为小的业务模块,分别部署在不同的机器上
框架演进
分布式框架
SOA框架
微服务架构
Dubbo架构
![](https://img-blog.csdnimg.cn/5f3a9cf4d95d45dfb66bb5fef9a27d40.png)
快速入门
feign远程调用与Dubbo远程调用区别
其实和feign远程调用是一个意思,Feign和Dubbo都可以实现远程调用,他们都依赖注册中心,他们都支持负载均衡,
服务熔断。
自己理解:
1、然而Feign是基于Http协议,Dubbo是基于业务来的。粒度一个是http接口级一个方法级
2、一个是短连接,一个长连接
3、一个适合简洁少侵入,一个适合少数据高并发
大牛说:
Feign和Dubbo都可以实现远程调用,他们都依赖注册中心,他们都支持负载均衡,服务熔断。
然而Feign是基于Http协议。服务提供者需要对外暴露Http接口供消费者调用(例如我们用@openFeign注解来标识远程调用服务的接口时,需要加@RequestMapping)**服务粒度是http接口级**的。通过**短连接**的方式进行通信,不适合**高并发**的访问。Feign追求的是**简洁,少侵入**(因为就服务端而言,在SpringCloud环境下,不需要做任何额外的操作,而Dubbo的服务端需要配置开放的Dubbo接口)。
至于Dubbo,Dubbo支持多传输协议(Dubbo、Rmi、http、redis等等),可以根据业务场景选择最佳的方式,非常灵活。默认的Dubbo协议:利用Netty,TCP传输,单一、异步、**长连接**,适合数据量小、高并发和服务提供者远远少于消费者的场景。Dubbo通过TCP长连接的方式进行通信,服务粒度是方法级的。
从协议层选择看,Dubbo是配置化的,更加灵活。Dubbo协议更适合小数据高并发场景。
feign接口
@FeignClient(value = "leadnews-article",fallback = IArticleClientFallback.class)
public interface IArticleClient {
@PostMapping("/api/v1/article/save")
public ResponseResult saveArticle(@RequestBody ArticleDto dto);
}
2、在继承的模块中调用此方法
@Autowired
private IArticleClient articleClient;
ResponseResult responseResult = articleClient.saveArticle(dto);
3、在需要调用的模块中定一个feign接口的实现类,风格为正常controller形式
@RestController
public class ArticleClient implements IArticleClient {
@Autowired
private ApArticleService apArticleService;
@PostMapping("/api/v1/article/save")
@Override
public ResponseResult saveArticle(@RequestBody ArticleDto dto) {
return apArticleService.saveArticle(dto);
}
}
Dubbo
1、抽象出需要调用方法
public interface UserService {
public String sayHello();
}
2、提供者方:@Service给Dubbo提供方法,配置扫描
@Service//将这个类提供的方法(服务)对外发布。将访问的地址 ip,端口,路径注册到注册中心中
public class UserServiceImpl implements UserService {
public String sayHello() {
return "hello dubbo hello!~";
}
}
<!--dubbo的配置-->
<!--1.配置项目的名称,唯一-->
<dubbo:application name="dubbo-service"/>
<!--2.配置注册中心的地址-->
<dubbo:registry address="zookeeper://192.168.149.135:2181"/>
<!--3.配置dubbo包扫描-->
<dubbo:annotation package="com.itheima.service.impl" />
3、消费者方同样需要把controller交给Dubbo,@Reference注解远程注入,创建代理对象实现远程调用。
<!--dubbo的配置-->
<!--1.配置项目的名称,唯一-->
<dubbo:application name="dubbo-web" >
<dubbo:parameter key="qos.port" value="33333"/>
</dubbo:application>
<!--2.配置注册中心的地址-->
<dubbo:registry address="zookeeper://192.168.149.135:2181"/>
<!--3.配置dubbo包扫描-->
<dubbo:annotation package="com.itheima.controller" />
1. 从zookeeper注册中心获取userService的访问url
2. 进行远程调用RPC
3. 将结果封装为一个代理对象。给变量赋值
@Reference//远程注入
private UserService userService;
@RequestMapping("/sayHello")
public String sayHello(){
return userService.sayHello();
}
Dubbo 高级特性
会自动缓存之前之前使用过的
灰度发布:当出现新功能时,会让一部分用户先使用新功能,用户反馈没问题时,再将所有用户迁移到新功能。
dubbo 中使用version 属性来设置和调用同一个接口的不同版本