当前位置:   article > 正文

springboot 整合 Dubbo 与 Feign (无注册中心)_feignclient不走注册中心

feignclient不走注册中心

注:文章皆为个人纪录,可用性请以最终结果为准,若有错还请大佬们指出,谢谢!

 springboot 版本需要与 spring boot对应,否则启动报错

如 2.5.4 版本的springboot对应  3.0.5 版本的 open-feign

版本不兼容时,报错信息参考如下:

  1. ***************************
  2. APPLICATION FAILED TO START
  3. ***************************
  4. Description:
  5. Your project setup is incompatible with our requirements due to following reasons:
  6. - Spring Boot [2.5.4] is not compatible with this Spring Cloud release train
  7. Action:
  8. Consider applying the following actions:
  9. - Change Spring Boot version to one of the following versions [2.6.x, 2.7.x] .
  10. You can find the latest Spring Boot versions here [https://spring.io/projects/spring-boot#learn].
  11. If you want to learn more about the Spring Cloud Release train compatibility, you can visit this page [https://spring.io/projects/spring-cloud#overview] and check the [Release Trains] section.
  12. If you want to disable this check, just set the property [spring.cloud.compatibility-verifier.enabled=false]
  13. Disconnected from the target VM, address: '127.0.0.1:58225', transport: 'socket'
  14. Process finished with exit code 1

一,SpringBoot 整合 Dubbo

1.1 服务提供者

1.1.1 核心依赖

  1. <!-- dubbo依赖 -->
  2. <dependency>
  3. <groupId>org.apache.dubbo</groupId>
  4. <artifactId>dubbo-spring-boot-starter</artifactId>
  5. <version>3.0.5</version>
  6. </dependency>

1.1.2 核心配置

  1. server:
  2. port: 8081
  3. spring:
  4. application:
  5. name: provide-api
  6. dubbo:
  7. registry:
  8. address: N/A # 表示无注册中心
  9. protocol:
  10. name: dubbo # 提供者协议
  11. port: 18081 # 提供者dubbo端口
  12. host: 127.0.0.1 # 服务提供者所在机器地址
  13. scan:
  14. base-packages: com.paycools.service # 提供者需要交由dubbo管理的扫描包路径
  15. application:
  16. name: provide-server # 提供者服务名

1.1.3 服务提供者代码结构

 1.1.4 服务提供者暴露的API(DubboDemoServiceImpl)

  1. package com.jxz.service.impl;
  2. import com.jxz.service.IDubboDemoService;
  3. import com.jxz.service.vo.User;
  4. import lombok.extern.slf4j.Slf4j;
  5. import org.apache.dubbo.config.annotation.DubboService;
  6. import org.springframework.stereotype.Service;
  7. import java.util.ArrayList;
  8. import java.util.List;
  9. /**
  10. * @author jiangXueZhi
  11. * @data 2022/4/1
  12. */
  13. @Service // spring 的注解
  14. @DubboService // dubbo 提供者的注解
  15. @Slf4j
  16. public class DubboDemoServiceImpl implements IDubboDemoService {
  17. /**
  18. * 用于测试 dubbo 的rpc 远程过程调用是否成功
  19. */
  20. @Override
  21. public String dubboTest() {
  22. log.info("########### 服务提供者成功提供API响应");
  23. return "服务提供者成功提供API响应";
  24. }
  25. /**
  26. * 用于测试 dubbo 的rpc 远程过程调用携带参数与返回值是否正常
  27. */
  28. @Override
  29. public List<User> dubboVoTest(Integer aa) {
  30. if (aa == 1) {
  31. List<User> list = new ArrayList<>(3);
  32. list.add(new User().setName("张三").setAge(18));
  33. list.add(new User().setName("李四").setAge(5));
  34. log.info("########### 服务提供者成功提供API响应,参数为{}, 返回值为{}", aa, list);
  35. return list;
  36. }
  37. log.info("########### 服务提供者成功提供API响应,参数为{}, 返回值为{}", aa, null);
  38. return null;
  39. }
  40. }

1.1.5 服务提供者端的对象(User)

一定要实现序列化!!!

  1. package com.jxz.service.vo;
  2. import lombok.Data;
  3. import lombok.experimental.Accessors;
  4. import java.io.Serializable;
  5. /**
  6. * @author jiangXueZhi
  7. * @data 2022/4/2
  8. */
  9. @Data
  10. @Accessors(chain = true)
  11. public class User implements Serializable { // 一定要序列化,因为dubbo传输数据以二进制的方式
  12. private String name;
  13. private int age;
  14. }

1.2 服务消费者

1.2.1 核心依赖

与提供者端一样

  1. <!-- dubbo依赖 -->
  2. <dependency>
  3. <groupId>org.apache.dubbo</groupId>
  4. <artifactId>dubbo-spring-boot-starter</artifactId>
  5. <version>3.0.5</version>
  6. </dependency>

1.2.2 核心配置

  1. server:
  2. port: 8082
  3. spring:
  4. application:
  5. name: consumer-api
  6. dubbo:
  7. registry:
  8. address: N/A # 表示无注册中心
  9. #scan: # 作为提供者时使用
  10. #base-packages: com.paycools.service # 扫描包的路径
  11. protocol:
  12. name: dubbo
  13. port: 18082
  14. host: 127.0.0.1
  15. application:
  16. name: consumer-server
  17. # 自定义配置--因无注册中心,则需指定服务提供者地址
  18. provide:
  19. host: "dubbo://127.0.0.1:18081"

1.2.3 服务消费者代码结构

注意,本文中的 UserDemo 完全可以不需要,

可以直接在Controller中注入 IDubboDemoService

 1.2.4 服务消费者调用服务提供者

controller

  1. package com.jxz.controller;
  2. import com.jxz.service.UserDemo;
  3. import org.springframework.web.bind.annotation.PathVariable;
  4. import org.springframework.web.bind.annotation.RequestMapping;
  5. import org.springframework.web.bind.annotation.RequestMethod;
  6. import org.springframework.web.bind.annotation.RestController;
  7. import javax.annotation.Resource;
  8. /**
  9. * @author jiangXueZhi
  10. * @data 2022/4/1
  11. */
  12. @RequestMapping("/api")
  13. @RestController
  14. public class DemoTestController {
  15. @Resource
  16. private UserDemo userDemo;
  17. @RequestMapping(value = "/demoTest", method = RequestMethod.GET)
  18. public String demoTest() {
  19. return userDemo.demoTest();
  20. }
  21. @RequestMapping(value = "/demoVoTest/{aa}", method = RequestMethod.GET)
  22. public String demoVoTest(@PathVariable("aa") Integer aa) {
  23. return userDemo.demoVoTest(aa);
  24. }
  25. }

userDemo(可省去此类,而直接调用提供者API)

  1. package com.jxz.service;
  2. import org.apache.dubbo.config.annotation.DubboReference;
  3. import org.springframework.stereotype.Service;
  4. /**
  5. * @author jiangXueZhi
  6. * @data 2022/4/1
  7. */
  8. @Service
  9. public class UserDemo {
  10. @DubboReference(check = false, url = "${provide.host}") // 无注册中心时的参数配置
  11. IDubboDemoService iDubboDemoService;
  12. public String demoTest() {
  13. return "### 服务消费者成功拿到提供者的API响应:" + iDubboDemoService.dubboTest();
  14. }
  15. public String demoVoTest(Integer aa) {
  16. return "### <带参数以及对象返回值> 服务消费者成功拿到提供者的API响应:" + iDubboDemoService.dubboVoTest(aa);
  17. }
  18. }

IDubboDemoService 

包的路径与名称必须与服务提供者端的保持一致!!!并且无需实现

  1. package com.jxz.service;
  2. import com.paycools.service.pojo.User;
  3. import java.util.List;
  4. public interface IDubboDemoService {
  5. String dubboTest();
  6. List<User> dubboVoTest(Integer aa);
  7. }

User

  1. package com.jxz.service.pojo;
  2. import lombok.Data;
  3. import java.io.Serializable;
  4. /**
  5. * @author jiangXueZhi
  6. * @data 2022/4/2
  7. */
  8. @Data
  9. public class User implements Serializable { // 必须实现序列化
  10. private String name;
  11. private int age;
  12. }

1.3 调用示例

1.3.1 消费者入口(测试是否导通)

1.3.1.1 服务提供者端日志打印

2022-04-06 11:27:03.047  INFO 12284 --- [:18081-thread-6] c.p.service.impl.DubboDemoServiceImpl    : ###########  服务提供者成功提供API响应

1.3.2 消费者入口(测试携带参数与返回值)

 1.3.2.1 服务提供者端日志打印

  1. 2022-04-06 11:30:46.489 INFO 12284 --- [:18081-thread-9] c.p.service.impl.DubboDemoServiceImpl : ########### 服务提供者成功提供API响应,参数为0, 返回值为null
  2. 2022-04-06 11:30:58.910 INFO 12284 --- [18081-thread-10] c.p.service.impl.DubboDemoServiceImpl : ########### 服务提供者成功提供API响应,参数为1, 返回值为[User(name=张三, age=18), User(name=李四, age=5)]

1.4 小结

a.  dubbo 服务提供者暴露的API,在服务消费者中必须保持包名与文件名一致

b.  dubbo 服务消费者在注入API时,要用到  @DubboReference 注解

c.  dubbo 基于TCP传输协议,其对象都必须实现序列化

二, SpringBoot 整合 Feign

2.1 服务提供者

使用feign 的方式时,服务提供者无需任何特殊处理,仅正常启动程序即可

2.1.1 服务提供者基础配置 

  1. server:
  2. port: 8083
  3. spring:
  4. application:
  5. name: provide-server
  6. profiles:
  7. active: dev

2.1.2 服务提供者代码结构 

2.2 服务消费者 

2.2.1 服务消费者代码结构

2.2.2 核心依赖

  1. <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-openfeign -->
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-openfeign</artifactId>
  5. <version>3.1.1</version>
  6. </dependency>

 2.2.3 核心配置

  1. server:
  2. port: 8084
  3. spring:
  4. application:
  5. name: consumer-server
  6. # 自定义配置,因无注册中心,需直接指定服务提供者
  7. provider:
  8. application-name: provide-server
  9. host: http://127.0.0.1:8083

2.2.3 启动类注解 

  1. package com.jxz;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.openfeign.EnableFeignClients;
  5. @SpringBootApplication
  6. @EnableFeignClients
  7. public class FeignConsumerDemoApplication {
  8. public static void main(String[] args) {
  9. SpringApplication.run(FeignConsumerDemoApplication.class, args);
  10. System.out.println("服务消费者启动成功...");
  11. }
  12. }

2.2.4 在消费者端中声明提供者端的API

  1. package com.paycools.service;
  2. import com.paycools.pojo.User;
  3. import org.springframework.cloud.openfeign.FeignClient;
  4. import org.springframework.web.bind.annotation.PathVariable;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import java.util.List;
  7. @FeignClient(value = "${provider.application-name}", url = "${provider.host}") // 因无注册中心,需直接指定其url
  8. public interface IProvideService {
  9. @RequestMapping("/api/provide/getProvideResponse")
  10. String getProvideResponse();
  11. @RequestMapping("/api/provide/getProvideVoResponse/{id}")
  12. List<User> getProvideVoResponse(@PathVariable("id") Integer id);
  13. }

 2.2.5 在消费者端中调用提供者端的API

  1. package com.jxz.controller;
  2. import com.jxz.service.IProvideService;
  3. import lombok.extern.slf4j.Slf4j;
  4. import org.springframework.web.bind.annotation.PathVariable;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import org.springframework.web.bind.annotation.RequestMethod;
  7. import org.springframework.web.bind.annotation.RestController;
  8. import javax.annotation.Resource;
  9. /**
  10. * @author jiangXueZhi
  11. * @data 2022/4/2
  12. */
  13. @RestController
  14. @RequestMapping("/api/consumer")
  15. @Slf4j
  16. public class ConsumerDemoController {
  17. @Resource
  18. private IProvideService iProvideService;
  19. @RequestMapping("/getProvideResponse")
  20. public String getProvideResponse() {
  21. log.info("服务消费者,成功调用服务提供者API");
  22. return "服务消费者端," + iProvideService.getProvideResponse();
  23. }
  24. @RequestMapping(value = "/getProvideVoResponse/{id}", method = RequestMethod.GET)
  25. public String getProvideVoResponse(@PathVariable("id") Integer id) {
  26. log.info("服务消费者,成功调用服务提供者API");
  27. return "服务消费者端," + iProvideService.getProvideVoResponse(id);
  28. }
  29. }

2.3 调用示例

2.3.1 测试是否导通

 2.3.1.1 服务提供者端的日志打印

2022-04-06 11:56:46.472  INFO 4724 --- [nio-8083-exec-1] com.paycools.controller.UserController   : 服务提供者, 成功通过feign的方式提供服务

2.3.1.2 服务消费者端的日志打印

2022-04-06 11:56:46.399  INFO 3352 --- [nio-8084-exec-2] c.p.controller.ConsumerDemoController    : 服务消费者,成功调用服务提供者API

2.3.2 测试携带参数与获取返回值是否正常

2.3.2.1 服务提供者端的日志打印

  1. 2022-04-06 12:01:14.588 INFO 4724 --- [nio-8083-exec-8] com.paycools.controller.UserController : 服务提供者, <带有参数与返回值>成功通过feign的方式提供服务, 参数为0,响应为null
  2. 2022-04-06 12:02:51.754 INFO 4724 --- [nio-8083-exec-5] com.paycools.controller.UserController : 服务提供者, <带有参数与返回值>成功通过feign的方式提供服务, 参数为1,响应为[User(id=1, name=王五, age=19), User(id=1, name=赵六, age=15)]

2.3.2.2 服务消费者端的日志打印

  1. 2022-04-06 12:01:14.579 INFO 3352 --- [nio-8084-exec-3] c.p.controller.ConsumerDemoController : 服务消费者,成功调用服务提供者API
  2. 2022-04-06 12:02:51.751 INFO 3352 --- [nio-8084-exec-8] c.p.controller.ConsumerDemoController : 服务消费者,成功调用服务提供者API

2.4 小结

a. 服务提供者无需特殊操作

b. 服务消费者端启动类声明注解

c. 服务消费者端声明服务提供者的API,然后调用时与本地API无异

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

闽ICP备14008679号