当前位置:   article > 正文

dubbo(7):配置(2)_org.apache.dubbo.config.annotation.dubboservice 版本

org.apache.dubbo.config.annotation.dubboservice 版本

五、多版本(灰度发布)

    在 Dubbo 中为同一个服务配置多个版本。当一个接口实现,出现不兼容升级时,可以用版本号过渡,版本号不同的服务相互间不引用。(详细查看官方文档用法实例)

    可以按照以下的步骤进行版本迁移:

  1. 在低压力时间段,先升级一半提供者为新版本
  2. 再将所有消费者升级为新版本
  3. 然后将剩下的一半提供者升级为新版本

    把UserServiceImpl复制一份,作为新版本。

    分别定义两个版本号。

  1. package com.buba.service.impl;
  2. import com.buba.pojo.UserAddress;
  3. import com.buba.service.UserService;
  4. import org.apache.dubbo.config.annotation.DubboService;
  5. import org.springframework.stereotype.Service;
  6. import java.util.Arrays;
  7. import java.util.List;
  8. @DubboService(version = "1.0.0") // 暴露服务
  9. @Service
  10. public class UserServiceImpl implements UserService {
  11. @Override
  12. public List<UserAddress> getUserAddressList(String userId) {
  13. UserAddress userAddress1 = new UserAddress(1, "北京", "1", "张三", "17611112222", "是");
  14. UserAddress userAddress2 = new UserAddress(2, "天津", "1", "张三", "17611112222", "是");
  15. return Arrays.asList(userAddress1, userAddress2);
  16. }
  17. }
  1. package com.buba.service.impl;
  2. import com.buba.pojo.UserAddress;
  3. import com.buba.service.UserService;
  4. import org.apache.dubbo.config.annotation.DubboService;
  5. import org.springframework.stereotype.Service;
  6. import java.util.Arrays;
  7. import java.util.List;
  8. @DubboService(version = "2.0.0") // 暴露服务
  9. @Service
  10. public class UserServiceImpl2 implements UserService {
  11. @Override
  12. public List<UserAddress> getUserAddressList(String userId) {
  13. UserAddress userAddress1 = new UserAddress(1, "北京", "1", "张三", "17611112222", "是");
  14. UserAddress userAddress2 = new UserAddress(2, "天津", "1", "张三", "17611112222", "是");
  15. return Arrays.asList(userAddress1, userAddress2);
  16. }
  17. }

    这样在消费方就可以指定使用哪个版本的服务。

  1. package com.buba.service.impl;
  2. import com.buba.pojo.UserAddress;
  3. import com.buba.service.OrderService;
  4. import com.buba.service.UserService;
  5. import org.apache.dubbo.config.annotation.DubboReference;
  6. import org.springframework.stereotype.Service;
  7. import java.util.List;
  8. @Service
  9. public class OrderServiceImpl implements OrderService {
  10. @DubboReference(retries = 3,version = "1.0.0") // 去dubbo注册中心中寻找
  11. private UserService userService;
  12. @Override
  13. public List<UserAddress> initOrder(String userId) {
  14. return userService.getUserAddressList("1");
  15. }
  16. }

六、本地存根

    在 Dubbo 中利用本地存根在客户端执行部分逻辑。远程服务后,客户端通常只剩下接口,而实现全在服务器端,但提供方有些时候想在客户端也执行部分逻辑,比如:做 ThreadLocal 缓存,提前验证参数,调用失败后伪造容错数据等等,此时就需要在 API 中带上 Stub,客户端生成 Proxy 实例,会把 Proxy 通过构造函数传给 Stub 1,然后把 Stub 暴露给用户,Stub 可以决定要不要去调 Proxy。

    在订单客户端创建一个用户实现(本地存根)用于验证。

    编写本地存根实现。

  1. package com.buba.service.impl;
  2. import com.buba.pojo.UserAddress;
  3. import com.buba.service.UserService;
  4. import java.util.List;
  5. public class UserServiceStub implements UserService {
  6. private final UserService userService;
  7. /**
  8. * 传入UserService远程的代理对象
  9. *
  10. * @param userService
  11. */
  12. public UserServiceStub(UserService userService) {
  13. this.userService = userService;
  14. }
  15. @Override
  16. public List<UserAddress> getUserAddressList(String userId) {
  17. if (!"".equals(userId)) {
  18. return userService.getUserAddressList(userId);
  19. }
  20. return null;
  21. }
  22. }

    配置本地存根。

  1. package com.buba.service.impl;
  2. import com.buba.pojo.UserAddress;
  3. import com.buba.service.OrderService;
  4. import com.buba.service.UserService;
  5. import org.apache.dubbo.config.annotation.DubboReference;
  6. import org.springframework.stereotype.Service;
  7. import java.util.List;
  8. @Service
  9. public class OrderServiceImpl implements OrderService {
  10. @DubboReference(retries = 3,version = "1.0.0",stub = "com.buba.service.impl.UserServiceStub") // 去dubbo注册中心中寻找
  11. private UserService userService;
  12. @Override
  13. public List<UserAddress> initOrder(String userId) {
  14. return userService.getUserAddressList("1");
  15. }
  16. }

七。dubbo服务方法级配置

    导入dubbo-spring-boot-starter包,在application.yml中配置。使用@DubboService发布服务,@DubboReference引用服务,@EnableDubbo开启dubbo注解扫描。通过@Method可以将dubbo精确到方法级。

  1. package com.buba.service.impl;
  2. import com.buba.pojo.UserAddress;
  3. import com.buba.service.UserService;
  4. import org.apache.dubbo.config.annotation.DubboService;
  5. import org.apache.dubbo.config.annotation.Method;
  6. import org.springframework.stereotype.Service;
  7. import java.util.Arrays;
  8. import java.util.List;
  9. @DubboService(version = "1.0.0", methods = {@Method(name = "getUserAddressList", timeout = 250, retries = 0)}) // 暴露服务
  10. @Service
  11. public class UserServiceImpl implements UserService {
  12. @Override
  13. public List<UserAddress> getUserAddressList(String userId) {
  14. UserAddress userAddress1 = new UserAddress(1, "北京", "1", "张三", "17611112222", "是");
  15. UserAddress userAddress2 = new UserAddress(2, "天津", "1", "张三", "17611112222", "是");
  16. return Arrays.asList(userAddress1, userAddress2);
  17. }
  18. }

    可以在启动类中通过注解加载dubbo配置(xml)文件方式。

  1. package com.buba;
  2. import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. import org.springframework.context.annotation.ImportResource;
  6. // @EnableDubbo // 开启基于注解的Dubbo功能
  7. @ImportResource(locations = "classpath:consumer.xml")
  8. @SpringBootApplication
  9. public class OrderServiceConsumer_8802 {
  10. public static void main(String[] args) {
  11. SpringApplication.run(OrderServiceConsumer_8802.class, args);
  12. }
  13. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/165882?site
推荐阅读
相关标签
  

闽ICP备14008679号