服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - springboot整合Dubbo与Feign的实现 (无注册中心)

springboot整合Dubbo与Feign的实现 (无注册中心)

2022-11-09 11:46Sonder、Aiden Java教程

本文主要介绍了springboot整合Dubbo与Feign的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一,SpringBoot 整合 Dubbo

1.1 服务提供者

1.1.1 核心依赖

<!-- dubbo依赖 -->
      <dependency>
          <groupId>org.apache.dubbo</groupId>
          <artifactId>dubbo-spring-boot-starter</artifactId>
          <version>3.0.5</version>
      </dependency>

1.1.2 核心配置

server:
port: 8081
spring:
application:
  name: provide-api

dubbo:
registry:
  address: N/A # 表示无注册中心
protocol:
  name: dubbo # 提供者协议
  port: 18081 # 提供者dubbo端口
  host: 127.0.0.1 # 服务提供者所在机器地址
scan:
  base-packages: com.paycools.service # 提供者需要交由dubbo管理的扫描包路径
application:
  name: provide-server # 提供者服务名

1.1.3 服务提供者代码结构

springboot整合Dubbo与Feign的实现 (无注册中心)

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

package com.jxz.service.impl;

import com.jxz.service.IDubboDemoService;
import com.jxz.service.vo.User;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
* @author jiangXueZhi
* @data 2022/4/1
*/
@Service // spring 的注解
@DubboService // dubbo 提供者的注解
@Slf4j
public class DubboDemoServiceImpl implements IDubboDemoService {
  /**
   * 用于测试 dubbo 的rpc 远程过程调用是否成功
   */
  @Override
  public String dubboTest() {
      log.info("###########  服务提供者成功提供API响应");
      return "服务提供者成功提供API响应";
  }

  /**
   * 用于测试 dubbo 的rpc 远程过程调用携带参数与返回值是否正常
   */
  @Override
  public List<User> dubboVoTest(Integer aa) {
      if (aa == 1) {
          List<User> list = new ArrayList<>(3);
          list.add(new User().setName("张三").setAge(18));
          list.add(new User().setName("李四").setAge(5));
          log.info("###########  服务提供者成功提供API响应,参数为{}, 返回值为{}", aa, list);
          return list;
      }
      log.info("###########  服务提供者成功提供API响应,参数为{}, 返回值为{}", aa, null);
      return null;
  }
}

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

一定要实现序列化!!!

package com.jxz.service.vo;

import lombok.Data;
import lombok.experimental.Accessors;

import java.io.Serializable;

/**
* @author jiangXueZhi
* @data 2022/4/2
*/
@Data
@Accessors(chain = true)
public class User implements Serializable { // 一定要序列化,因为dubbo传输数据以二进制的方式
  private String name;
  private int age;
}

1.2 服务消费者

1.2.1 核心依赖

与提供者端一样

<!-- dubbo依赖 -->
      <dependency>
          <groupId>org.apache.dubbo</groupId>
          <artifactId>dubbo-spring-boot-starter</artifactId>
          <version>3.0.5</version>
      </dependency>

1.2.2 核心配置

server:
port: 8082
spring:
application:
  name: consumer-api

dubbo:
registry:
  address: N/A # 表示无注册中心
#scan: # 作为提供者时使用
  #base-packages: com.paycools.service # 扫描包的路径
protocol:
  name: dubbo
  port: 18082
  host: 127.0.0.1
application:
  name: consumer-server

# 自定义配置--因无注册中心,则需指定服务提供者地址
provide:
host: "dubbo://127.0.0.1:18081"

1.2.3 服务消费者代码结构

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

可以直接在Controller中注入IDubboDemoService

springboot整合Dubbo与Feign的实现 (无注册中心)

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

controller

package com.jxz.controller;

import com.jxz.service.UserDemo;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

/**
* @author jiangXueZhi
* @data 2022/4/1
*/
@RequestMapping("/api")
@RestController
public class DemoTestController {
  @Resource
  private UserDemo userDemo;

  @RequestMapping(value = "/demoTest", method = RequestMethod.GET)
  public String demoTest() {
      return userDemo.demoTest();
  }

  @RequestMapping(value = "/demoVoTest/{aa}", method = RequestMethod.GET)
  public String demoVoTest(@PathVariable("aa") Integer aa) {
      return userDemo.demoVoTest(aa);
  }
}

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

package com.jxz.service;

import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.stereotype.Service;

/**
* @author jiangXueZhi
* @data 2022/4/1
*/
@Service
public class UserDemo {

  @DubboReference(check = false, url = "${provide.host}") // 无注册中心时的参数配置
  IDubboDemoService iDubboDemoService;

  public String demoTest() {
      return "###  服务消费者成功拿到提供者的API响应:" + iDubboDemoService.dubboTest();
  }

  public String demoVoTest(Integer aa) {
      return "### <带参数以及对象返回值> 服务消费者成功拿到提供者的API响应:" + iDubboDemoService.dubboVoTest(aa);
  }
}

IDubboDemoService

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

package com.jxz.service;

import com.paycools.service.pojo.User;

import java.util.List;

public interface IDubboDemoService {
  String dubboTest();

  List<User> dubboVoTest(Integer aa);
}

User

package com.jxz.service.pojo;

import lombok.Data;

import java.io.Serializable;

/**
* @author jiangXueZhi
* @data 2022/4/2
*/
@Data
public class User implements Serializable { // 必须实现序列化
  private String name;
  private int age;
}

1.3 调用示例

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

springboot整合Dubbo与Feign的实现 (无注册中心)

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 消费者入口(测试携带参数与返回值)

springboot整合Dubbo与Feign的实现 (无注册中心)

springboot整合Dubbo与Feign的实现 (无注册中心)

1.3.2.1 服务提供者端日志打印

2022-04-06 11:30:46.489 INFO 12284 --- [:18081-thread-9] c.p.service.impl.DubboDemoServiceImpl : ########### 服务提供者成功提供API响应,参数为0, 返回值为null

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 服务提供者基础配置

server:
port: 8083

spring:
application:
  name: provide-server
profiles:
  active: dev

2.1.2服务提供者代码结构

springboot整合Dubbo与Feign的实现 (无注册中心)

2.2 服务消费者

2.2.1 服务消费者代码结构

springboot整合Dubbo与Feign的实现 (无注册中心)

2.2.2核心依赖

<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-openfeign -->
      <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-openfeign</artifactId>
          <version>3.1.1</version>
      </dependency>

2.2.3核心配置

server:
port: 8084
spring:
application:
  name: consumer-server


# 自定义配置,因无注册中心,需直接指定服务提供者
provider:
application-name: provide-server
host: http://127.0.0.1:8083

2.2.3 启动类注解

package com.jxz;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication
@EnableFeignClients
public class FeignConsumerDemoApplication {

  public static void main(String[] args) {
      SpringApplication.run(FeignConsumerDemoApplication.class, args);
      System.out.println("服务消费者启动成功...");
  }

}

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

package com.paycools.service;

import com.paycools.pojo.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.List;

@FeignClient(value = "${provider.application-name}", url = "${provider.host}") // 因无注册中心,需直接指定其url
public interface IProvideService {

  @RequestMapping("/api/provide/getProvideResponse")
  String getProvideResponse();

  @RequestMapping("/api/provide/getProvideVoResponse/{id}")
  List<User> getProvideVoResponse(@PathVariable("id") Integer id);
}

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

package com.jxz.controller;

import com.jxz.service.IProvideService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

/**
* @author jiangXueZhi
* @data 2022/4/2
*/
@RestController
@RequestMapping("/api/consumer")
@Slf4j
public class ConsumerDemoController {

  @Resource
  private IProvideService iProvideService;

  @RequestMapping("/getProvideResponse")
  public String getProvideResponse() {
      log.info("服务消费者,成功调用服务提供者API");
      return "服务消费者端," + iProvideService.getProvideResponse();
  }

  @RequestMapping(value = "/getProvideVoResponse/{id}", method = RequestMethod.GET)
  public String getProvideVoResponse(@PathVariable("id") Integer id) {
      log.info("服务消费者,成功调用服务提供者API");
      return "服务消费者端," + iProvideService.getProvideVoResponse(id);
  }
}

2.3 调用示例

2.3.1 测试是否导通

springboot整合Dubbo与Feign的实现 (无注册中心)

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 测试携带参数与获取返回值是否正常

springboot整合Dubbo与Feign的实现 (无注册中心)

springboot整合Dubbo与Feign的实现 (无注册中心)

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

2022-04-06 12:01:14.588 INFO 4724 --- [nio-8083-exec-8] com.paycools.controller.UserController : 服务提供者, <带有参数与返回值>成功通过feign的方式提供服务, 参数为0,响应为null
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 服务消费者端的日志打印

2022-04-06 12:01:14.579 INFO 3352 --- [nio-8084-exec-3] c.p.controller.ConsumerDemoController : 服务消费者,成功调用服务提供者API
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无异

到此这篇关于springboot整合Dubbo与Feign的实现 (无注册中心)的文章就介绍到这了,更多相关springboot整合Dubbo与Feign 内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/weixin_42166505/article/details/123984244

延伸 · 阅读

精彩推荐
  • Java教程java 解压与压缩文件夹的实例详解

    java 解压与压缩文件夹的实例详解

    这篇文章主要介绍了 java 解压与压缩文件夹的实例详解的相关资料,希望通过本文能帮助到大家,让大家实现这样的功能,掌握这样的方法,需要的朋友可以...

    尚云峰1115072021-01-18
  • Java教程java实现的DES加密算法详解

    java实现的DES加密算法详解

    这篇文章主要介绍了java实现的DES加密算法,结合实例形式详细分析了java实现DES加密操作的原理、实现技巧与相关注意事项,需要的朋友可以参考下...

    听着music睡7812020-11-24
  • Java教程聊聊 Spring 数据库开发

    聊聊 Spring 数据库开发

    Spring的JDBC模块负责数据库资源管理和错误处理,大大简化了开发人员对数据库的操作,使得开发人员可以从繁琐的数据库操作中解脱出来,从而将更多的精...

    程序员千羽6932021-10-29
  • Java教程JavaWeb踩坑记录之项目访问不到html文件

    JavaWeb踩坑记录之项目访问不到html文件

    这篇文章主要给大家介绍了关于JavaWeb踩坑记录之项目访问不到html文件的相关资料,文中通过实例代码介绍的非常详细,对大家学习或者使用JavaWeb具有一定的...

    铁甲小宝同学4552022-08-24
  • Java教程java中BigDecimal进行加减乘除的基本用法

    java中BigDecimal进行加减乘除的基本用法

    大家应该对于不需要任何准确计算精度的数字可以直接使用float或double运算,但是如果需要精确计算的结果,则必须使用BigDecimal类,而且使用BigDecimal类也可...

    daisy2992020-07-11
  • Java教程Spring Boot CLI使用教程

    Spring Boot CLI使用教程

    本篇文章主要介绍了Spring Boot CLI使用教程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    木杉6922021-01-22
  • Java教程shiro之INI配置详解

    shiro之INI配置详解

    这篇文章主要为大家详细介绍了shiro之INI配置的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    动力节点10472021-01-07
  • Java教程SpringBoot整合Swagger2的步骤详解

    SpringBoot整合Swagger2的步骤详解

    这篇文章主要介绍了SpringBoot整合Swagger2的步骤详解,帮助大家更好的理解和学习使用SpringBoot框架,感兴趣的朋友可以了解下...

    尹瑞星7342021-09-06