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。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微笑点燃希望

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值