文档章节

Spring Cloud+Dubbo对Feign进行RPC改造

算法之名
 算法之名
发布于 2018/11/01 11:25
字数 982
阅读 183
收藏 3

因为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调用的吞吐量。

另外Springboot Dubbo的调试直连提供者,只连接固定IP的提供者,绕过注册中心,不进行负载均衡

@Reference(url = "dubbo://192.168.5.33:20880")
private AppUserService appUserService;

此方法只能在测试时使用,生产环境中必须去掉。

消息只订阅

dubbo:
  application:
    id: user-center-dubbo-prodiver
    name: user-center-dubbo-prodiver
  registry:
    address: zookeeper://192.168.5.129:2188
    register: false
  server: true
  protocol:
    name: dubbo
    port: 20880

这么写,注册中心注册不到你,其他消费者调用不到你这个服务,只有像上面直连提供者那种才可以调用的到。

这个也只是在测试环境里面使用,生产环境必须去掉 register: false 

© 著作权归作者所有

共有 人打赏支持
算法之名
粉丝 17
博文 114
码字总数 127948
作品 0
广州
私信 提问
史上最简单的SpringCloud教程 | 第四篇:断路器(Hystrix)

在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用。为了保证其高可用,单个服务通常会集群部署。...

方宏春
2018/04/14
0
0
史上最简单的SpringCloud教程 | 第四篇:断路器(Hystrix)(Finchley版本)

版权声明:本文为博主原创文章,欢迎转载,转载请注明作者、原文超链接 ,博主地址:http://blog.csdn.net/forezp。 https://blog.csdn.net/forezp/article/details/81040990 转载请标明出处...

方志朋
2018/07/14
0
0
Spring Cloud Feign的两种使用姿势

概述 最近结合一些别人的开源项目来学习Spring Cloud,其中关于服务消费这方面的一个很便利的工具 Feign让我记忆颇深。虽然网上的Demo和例子不胜枚举,但大多比较分散,本文就来集中记录一下...

CodeSheep
2018/09/29
0
0
Spring Cloud学习:02服务消费者(Ribbon&Feign)

在微服务架构中,业务会拆分成一个独立的服务,服务与服务之间基于http restful进行通信。Spring Cloud有两种服务调用方式,一种是Ribbon+restTemplate,另一种是Feign。 1 Ribbon+restTempl...

寒武没有纪
2017/10/21
0
0
微服务Springcloud超详细教程+实战(十四)

承接Javaweb、微信小程序、微信公众号项目。优秀团队,效率最先。联系QQ:1172796094 微信:bai631520 Feign 在前面的学习中,我们使用了Ribbon的负载均衡功能,大大简化了远程调用时的代码:...

求深圳java实习工作
01/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

eggjs与sequelize简单demo

参考 egg 官方文档 安装 // 依赖npm install --save egg-sequelize mysql2// ts 类型npm install --save @types/sequelize 插件,config/plugin.ts import { EggPlugin } from 'egg';......

Geeyu
31分钟前
0
0
看过上百部片子的这个人教你视频标签算法解析

本文由云+社区发表 随着内容时代的来临,多媒体信息,特别是视频信息的分析和理解需求,如图像分类、图像打标签、视频处理等等,变得越发迫切。目前图像分类已经发展了多年,在一定条件下已经...

腾讯云加社区
45分钟前
2
0
2. 红黑树

定义:红黑树(Red-Black Tree,简称R-B Tree),它一种特殊的二叉查找树(Binary Search Tree)。 要理解红黑树,先要了解什么是二叉查找树。在上一章中,我们学习了什么是二叉树,以及二叉树...

火拳-艾斯
46分钟前
2
0
input的button类型,点击页面跳转

一、input type=button 不做任何操作 例如: <input type="button" class="btn btn-primary" style="width: 30%" value="返回" onclick="window.location.href='/users/list'"></input> onc......

Sunki
53分钟前
1
0
踩坑:js 小数运算出现精度问题

背景 在学习小程序商城源码时发现了这个问题,单价可能出现小数,小数之间运算结果会莫名其妙多出一大串数字,比如下面这样👇。 在此之前我是知道 js 中著名的 0.1 + 0.2 != 0.3 的问题的,...

dkvirus
58分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部