Spring Cloud+Dubbo对Feign进行RPC改造
因为Spring Cloud Feign是基于Http Restful的调用,在高并发下的性能不够理想(虽然他是基于Ribbon以及带有熔断机制,可以防止雪崩),成为性能瓶颈,所以我们今天对Feign进行Dubbo的RPC改造。
我们Spring Cloud的项目结构如下

其中user-center是我们的用户中心,game-center是我们的游戏中心,以游戏中心调用用户中心的Feign如下
@Component
@FeignClient("user-center")
public interface UserClient { @PutMapping("/api-u/users-anon/internal/updateAppUser")
AppUser updateUser(@RequestBody AppUser appUser); @PostMapping("/api-u/users-anon/internal/users/updateUserBanlance")
String updateUserBanlance(@RequestParam("id") long id, @RequestParam("banlance") BigDecimal banlance);
}
我们先来改造用户中心作为Dubbo的提供者,pom添加Dubbo的引用
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
将service接口放入公共模块api-model
public interface AppUserService {
void addTestUser(AppUser user);
void addAppUser(AppUser appUser);
void updateAppUser(AppUser appUser);
LoginAppUser findByUsername(String username);
AppUser findById(Long id);
void setRoleToUser(Long id, Set<Long> roleIds);
void updatePassword(Long id, String oldPassword, String newPassword);
void updateWithdrawal(Long id, String oldPassword, String newPassword);
Page<AppUser> findUsers(Map<String, Object> params);
Set<SysRole> findRolesByUserId(Long userId);
void bindingPhone(Long userId, String phone);
int updateUserBanlance(long id, BigDecimal banlance);
Map<String, Object> findUserMapById(long userId);
Page<Map<String, Object>> findUsers(String username, BigDecimal minBanlance, BigDecimal maxBanlance, String startTime, String endTime, Integer groupId, Integer control, int pageNo, int pageSize);
void deleteTestUser(Assist assist);
}
用户中心资源配置,添加dubbo配置
spring:
application:
name: user-center
cloud:
config:
discovery:
enabled: true
serviceId: config-center
profile: dev
dubbo:
application:
id: user-center-dubbo-prodiver
name: user-center-dubbo-prodiver
registry:
address: zookeeper://192.168.5.129:2181
server: true
protocol:
name: dubbo
port: 20880
接口实现类的标签修改
@Slf4j
@Service(interfaceClass = AppUserService.class)
@Component
public class AppUserServiceImpl implements AppUserService {
其中这个@Service已经不再是spring的标签,而需要使用,
import com.alibaba.dubbo.config.annotation.Service;
的Dubbo标签
之前的spring @Service改用@Component
在Springboot的主类添加Dubbo的配置标签
@EnableDubboConfiguration
@EnableScheduling
@EnableSwagger2
@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class UserCenterApplication { public static void main(String[] args) {
SpringApplication.run(UserCenterApplication.class, args);
} }
此时启动用户中心项目,可以在Dubbo主控台中看到

点进去可以看到提供者注册信息

然后再来看看游戏中心的消费者
pom依赖跟用户中心一样
资源文件配置添加Dubbo配置
spring:
application:
name: game-center
cloud:
config:
discovery:
enabled: true
serviceId: config-center
profile: dev
dubbo:
application:
name: game-center-dubbo-consumer
id: game-center-dubbo-consumer
protocol:
port: 20800
name: dubbo
registry:
address: zookeeper://192.168.5.129:2181
在使用的Controller中注释掉之前的feign注入,使用Dubbo的接口
// @Autowired
// private UserClient userClient;
@Reference
private AppUserService appUserService;
因为该接口在公共模块api-model中,所以任何模块都可以识别的到,此时需要使用Dubbo的注释
import com.alibaba.dubbo.config.annotation.Reference;
在Springboot主类中添加Dubbo注释
@EnableDubboConfiguration
@EnableScheduling
@EnableSwagger2
@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class GameCenterApplication { public static void main(String[] args) {
ApplicationContext context = SpringApplication.run(GameCenterApplication.class, args);
SpringBootUtil.setApplicationContext(context);
}
}
启动游戏中心项目,在Dubbo控制台中的消费者中,我们可以看到

点进去可以看到消费者注册信息

这样我们在实际使用中,将之前的feign代码改成直接使用该service接口就可以通过RPC的远程调用了
//调用userService更新用户信息 TODO
// userClient.updateUser(user);
appUserService.addAppUser(user);
最后就是进行压测,性能要绝对优于Feign调用的吞吐量。
转载至链接:https://my.oschina.net/u/3768341/blog/2395878。
Spring Cloud+Dubbo对Feign进行RPC改造的更多相关文章
- Spring Cloud(Dalston.SR5)--Feign 声明式REST客户端
Spring Cloud 对 Feign 进行了封装,集成了 Ribbon 并结合 Eureka 可以实现客户端的负载均衡,Spring Cloud 实现的 Feign 客户端类名为 LoadBala ...
- Spring Cloud 入门 之 Feign 篇(三)
原文地址:Spring Cloud 入门 之 Feign 篇(三) 博客地址:http://www.extlight.com 一.前言 在上一篇文章<Spring Cloud 入门 之 Ribb ...
- 0.9.0.RELEASE版本的spring cloud alibaba sentinel+feign降级处理实例
既然用到了feign,那么主要是针对服务消费方的降级处理.我们基于0.9.0.RELEASE版本的spring cloud alibaba nacos+feign实例添油加醋,把sentinel功能加 ...
- spring cloud & dubbo
区别 来源(背景): Dubbo,是阿里巴巴服务化治理的核心框架,并被广泛应用于阿里巴巴集团的各成员站点. Spring Cloud,从命名我们就可以知道,它是Spring Source的产物,Spr ...
- Spring Cloud Alibaba(8)---Feign服务调用
Feign服务调用 有关Spring Cloud Alibaba之前写过五篇文章,这篇也是在上面项目的基础上进行开发. Spring Cloud Alibaba(1)---入门篇 Spring Clo ...
- Spring Cloud中关于Feign的常见问题总结
一.FeignClient接口,不能使用@GettingMapping 之类的组合注解 代码示例: @FeignClient("microservice-provider-user" ...
- Spring Cloud系列之Feign的常见问题总结
一.FeignClient接口,不能使用@GettingMapping 之类的组合注解 代码示例: @FeignClient("microservice-provider-user" ...
- spring cloud ribbon和feign的区别
spring cloud的Netflix中提供了两个组件实现软负载均衡调用:ribbon和feign. Ribbon 是一个基于 HTTP 和 TCP 客户端的负载均衡器 它可以在客户端配置 ribb ...
- spring cloud 学习(3) - feign入门
feign 是一个让rest服务调用更简洁的开源项目,很多介绍文章或书也称它为声明式REST调用.传统的web service中,通过引用wsdl来自动生成一些client的代理类(或stub代码), ...
随机推荐
- python 简单图像识别--验证码
python 简单图像识别--验证码 记录下,准备工作安装过程很是麻烦. 首先库:pytesseract,image,tesseract,PIL windows安装PIL,直接exe进行安装更方便( ...
- oracle导出表的建表语句拼接SQL
前段时间有个需求需要导出数据库的500张表结构,使用PLSQLDEV工具也可以导出建表语句,但是需要手动一个表一个表选,非常费劲.就写了个拼接sql. select 'select dbms_meta ...
- WordPress版微信小程序3.1.5版的新功能
产品的完善是无止境,每过段时间就会发现产品的新问题,使用的人越多,提的需求也会越多,我听得最多的一句话就是:如果加上某某功能就完美了.其实,完美是不存在的,每个人的视角不一样,完美的定义也是不一样的. ...
- 极速认识RSS!
在解释RSS是什么之前,让我先来举个栗子. 大家都能在街道看到许多海报栏.在那里,会贴出各种各样最新的消息,比如哪个系要开讲座了.星期二晚上的电影放什么.二手货转让等 等.只要看一下海报栏,就会对学校 ...
- Vue 使用axios获取数据
axios 的使用 1.安装 cnpm install axios --save 2.哪里用哪里引入axios <script> import Axios from 'axios' ...
- 微信小程序之弹出操作菜单
<view class="List_count" bindtap="actioncnt"> <view class="img&quo ...
- mpvue
使用mpvue开发小程序 首先安装 我们使用@vue/cli 无法使用vue init 可以全局安装一个@vue/cli-init npm install -g @vue/cli-init 然后初始化 ...
- 使用plot_importance绘制特征重要性曲线
代码如下所示: # -*- coding: utf-8 -*- #导入需要的包 import matplotlib.pyplot as plt from sklearn import datasets ...
- 稀疏矩阵 part 2
▶ 各种稀疏矩阵数据结构之间的转化 ● MAT ←→ CSR CSR * MATToCSR(const MAT *in) // MAT 转 CSR { checkNULL(in); CSR * out ...
- bits change world
No code is the best way to write secure and reliable applications. Write nothing; deploy nowhere.