说明
把已经有的feign接口直接改成通过dubbo协议直接调用
Dubbo Spring Cloud 提供了方案,即 @DubboTransported 注解,支持在类,方法,属性上使用。能够帮助服务消费端的 Spring Cloud Open Feign 接口以及 @LoadBalanced RestTemplate Bean 底层走 Dubbo 调用(可切换 Dubbo 支持的协议),而服务提供方则只需在原有 @RestController 类上追加 Dubbo @Servce 注解(需要抽取接口)即可,换言之,在不调整 Feign 接口以及 RestTemplate URL 的前提下,实现无缝迁移。
代码案例
代码来自 图灵学院, 我自己学完,做了个作业,然后给老师的代码整理了一下,加了个注释啥的.
代码地址和使用
https://gitee.com/zjj19941/ZJJ_Dubbo/tree/master/spring-cloud-alibaba-dubbo-feign
1.执行sql脚本
2.准备nacos服务端
3.修改配置文件地址
4.启动项目,先启动pringCloudDubboProviderUserFeignApplication , 再启动SpringCloudDubboConsumerUserFeignApplication
5.postman执行调用方法
localhost:8080/user/list 这个是http调用
localhost:8080/user/list2 这个是dubbo调用
localhost:8080/user/list3 这个是RestTemplate基于dubbo协议调用
修改服务提供者
@DubboService@Slf4j@RestController@RequestMapping("/user")public class UserServiceImpl implements UserService {@Autowiredprivate UserMapper userMapper;@Override@RequestMapping("/list")public List<User> list() {log.info("查询user列表");return userMapper.list();}@Override@RequestMapping("/getById/{id}")public User getById(@PathVariable("id") Integer id) {return userMapper.getById(id);}}
服务消费端引入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-dubbo</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
feign的实现,启动类上添加@EnableFeignClients
@SpringBootApplication@EnableFeignClientspublic class SpringCloudDubboConsumerUserFeignApplication {public static void main(String[] args) {SpringApplication.run(SpringCloudDubboConsumerUserFeignApplication.class, args);}}
feign接口添加 @DubboTransported 注解
@FeignClient(value = "spring-cloud-dubbo-provider-user-feign",path = "/user")@DubboTransported(protocol = "dubbo")public interface UserDubboFeignService {@RequestMapping("/list")public List<User> list();@RequestMapping("/getById/{id}")public User getById(@PathVariable("id") Integer id);}@FeignClient(value = "spring-cloud-dubbo-provider-user-feign",path = "/user")public interface UserFeignService {@RequestMapping("/list")public List<User> list();@RequestMapping("/getById/{id}")public User getById(@PathVariable("id") Integer id);}
调用对象添加 @DubboTransported 注解
@RestController@RequestMapping("/user")public class UserConstroller {@DubboReferenceprivate UserService userService;@RequestMapping("/info/{id}")public User info(@PathVariable("id") Integer id) {return userService.getById(id);}@Autowired//@DubboTransported(protocol = "dubbo") //思考dubbo协议是否生效? Spring 单例模式 不生效private UserFeignService userFeignService;/*** feign调用* localhost:8080/user/list*/@RequestMapping("/list")public List<User> list() {return userFeignService.list();}@Autowiredprivate UserDubboFeignService userDubboFeignService;/*** dubbo调用* localhost:8080/user/list2*/@RequestMapping("/list2")public List<User> list2() {return userDubboFeignService.list();}@Autowiredprivate RestTemplate restTemplate;@Bean@LoadBalanced@DubboTransportedpublic RestTemplate restTemplate() {return new RestTemplate();}/*** dubbo通过RestTemplate调用* localhost:8080/user/list3*/@RequestMapping("/list3")public List<User> list3() {String url = "http://spring-cloud-dubbo-provider-user-feign/user/list";return restTemplate.getForObject(url, List.class);}}
