因为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改造的更多相关文章

  1. Spring Cloud(Dalston.SR5)--Feign 声明式REST客户端

    Spring Cloud 对 Feign 进行了封装,集成了 Ribbon 并结合 Eureka 可以实现客户端的负载均衡,Spring Cloud 实现的 Feign 客户端类名为 LoadBala ...

  2. Spring Cloud 入门 之 Feign 篇(三)

    原文地址:Spring Cloud 入门 之 Feign 篇(三) 博客地址:http://www.extlight.com 一.前言 在上一篇文章<Spring Cloud 入门 之 Ribb ...

  3. 0.9.0.RELEASE版本的spring cloud alibaba sentinel+feign降级处理实例

    既然用到了feign,那么主要是针对服务消费方的降级处理.我们基于0.9.0.RELEASE版本的spring cloud alibaba nacos+feign实例添油加醋,把sentinel功能加 ...

  4. spring cloud & dubbo

    区别 来源(背景): Dubbo,是阿里巴巴服务化治理的核心框架,并被广泛应用于阿里巴巴集团的各成员站点. Spring Cloud,从命名我们就可以知道,它是Spring Source的产物,Spr ...

  5. Spring Cloud Alibaba(8)---Feign服务调用

    Feign服务调用 有关Spring Cloud Alibaba之前写过五篇文章,这篇也是在上面项目的基础上进行开发. Spring Cloud Alibaba(1)---入门篇 Spring Clo ...

  6. Spring Cloud中关于Feign的常见问题总结

    一.FeignClient接口,不能使用@GettingMapping 之类的组合注解 代码示例: @FeignClient("microservice-provider-user" ...

  7. Spring Cloud系列之Feign的常见问题总结

    一.FeignClient接口,不能使用@GettingMapping 之类的组合注解 代码示例: @FeignClient("microservice-provider-user" ...

  8. spring cloud ribbon和feign的区别

    spring cloud的Netflix中提供了两个组件实现软负载均衡调用:ribbon和feign. Ribbon 是一个基于 HTTP 和 TCP 客户端的负载均衡器 它可以在客户端配置 ribb ...

  9. spring cloud 学习(3) - feign入门

    feign 是一个让rest服务调用更简洁的开源项目,很多介绍文章或书也称它为声明式REST调用.传统的web service中,通过引用wsdl来自动生成一些client的代理类(或stub代码), ...

随机推荐

  1. 关于Spring的Quartz定时器设定

    在实际的开发业务中经常会遇到定时执行某个任务,如果项目使用的ssh框架的话,就需要配合spring来使用定时器.spring的定时器是一个固定的配置格式,具体的applicationContext配置 ...

  2. Three failed attempts of handling non-sequential data

    The Progress of Products Classification Cause now we are considering to classify the product by two ...

  3. centos 6.5 安装redis

    1. 下载redis,编译安装 下载地址:https://redis.io/download(建议大家都选择稳定版本) 下载到本地,然后上传到集群 当然也可以通过命令行直接在线下载 $ wget ht ...

  4. C#实现json压缩和格式化

    json作为常用数据文件,为了传输的效率,在传输前要进行压缩,而在传输后要进行格式化,以便阅读.下面是使用C#完成的格式化和压缩代码. public static string Compress(st ...

  5. windows 服务的安装与卸载之bat脚本命令

    在windows 平台下,服务的安装与卸载可通过bat 脚本命令来完成,同时可编辑服务的描述,具体代码如下: 1.服务的安装DynamicPlanService_installer.bat: @ech ...

  6. highcharts折线图的简单使用

    第一步:官网下载压缩包https://www.hcharts.cn/download 第二步:HTML中引入highcharts.js <!DOCTYPE html> <html&g ...

  7. 【HDFS API编程】删除文件

    所有操作都是以fileSystem为入口进行,我们使用fileSystem下的delete方法进行删除文件操作,删除的时候必须慎重. 直接上代码: /** * 删除文件 * @throws Excep ...

  8. leetcode每日刷题计划-简单篇day4

    腰酸腿疼肝数模 被教育说代码风格像是小学生而且有点冗余 QAQ之前面试官好像也说过orz努力改努力改 今天把前两天跳过的vector给简单看了一下补上了 Num 14 最长公共前缀 Longest C ...

  9. python 匿名函数&内置函数

    匿名函数:为了解决那些功能很简单的需求而设计的一句话函数怎么定义匿名函数: cal = lambda x : x*x # cal是函数名,lambda是定义匿名函数的关键字 冒号前面的额x是参数即函数 ...

  10. windows快速搭建FTP工具Serv-U FTP Server

    本文介绍一个简单的FTP工具,当然windows系统自带FTP工具,但是配置方法没有第三方工具来的简单可操作性好. 此工具用于搭建FTP环境,对于需要测试FTP上传功能具有极大帮助.例如球机抓拍图片上 ...