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

目录
  • 一,SpringBoot 整合 Dubbo
    • 1.1 服务提供者
      • 1.1.1 核心依赖
      • 1.1.2 核心配置
      • 1.1.3 服务提供者代码结构
      • 1.1.4 服务提供者暴露的API(DubboDemoServiceImpl)
      • 1.1.5 服务提供者端的对象(User)
    • 1.2 服务消费者
      • 1.2.1 核心依赖
      • 1.2.2 核心配置
      • 1.2.3 服务消费者代码结构
      • 1.2.4 服务消费者调用服务提供者
    • 1.3 调用示例
      • 1.3.1 消费者入口(测试是否导通)
      • 1.3.2 消费者入口(测试携带参数与返回值)
    • 1.4 小结
  • 二, SpringBoot 整合 Feign
    • 2.1 服务提供者
      • 2.1.1 服务提供者基础配置
    • 2.1.2 服务提供者代码结构
    • 2.2 服务消费者
      • 2.2.1 服务消费者代码结构
      • 2.2.2 核心依赖
      • 2.2.3 核心配置
      • 2.2.3 启动类注解
      • 2.2.4 在消费者端中声明提供者端的API
      • 2.2.5 在消费者端中调用提供者端的API
    • 2.3 调用示例
      • 2.3.1 测试是否导通
    • 2.4 小结

一,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 服务提供者代码结构

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

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 消费者入口(测试是否导通)

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 服务提供者端日志打印

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 服务提供者代码结构

2.2 服务消费者

2.2.1 服务消费者代码结构

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 测试是否导通

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 服务提供者端的日志打印

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 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 从零开始学springboot整合feign跨服务调用的方法

    介绍 微服务横行的互联网世界, 跨服务调用显得很平凡, 我们除了采用传统的http方式接口调用, 有没有更为优雅方便的方法呢? 答案是肯定的,feign就提供了轻便的方式! 如果你的服务都注册了注册中心,比如nacos, 那么调用会显得很轻松, 只需一个注解, 带上需要调用的服务名即可,**feign + nacos**会帮你做剩余的事. 如果没有注册中心, 也无需担心, feign一样可以以传统的 ip:port 方式进行调用~ 下面,我们来实践下吧 springboot整合feign 引入依

  • 解决Springboot中Feignclient调用时版本问题

    目录 大的背景就是 错误如下 这是Springboot版本不一致导致的问题 解决办法如下 现有Springboot项目三个,分别为jpmc-adapter, gsdic-api, twpre-api.gsdic-api, twpre-api是公共的服务,对外提供Restful的API,通过feign client去调用. 大的背景就是 jpmc-adapter现在需要调用另外两个公共的服务. Springboot版本: jpmc-adapter           1.5.9 gsdic-api

  • SpringBoot使用Feign调用其他服务接口

    使用SpringCloud的Feign组件能够为服务间的调用节省编码时间并提高开发效率,当服务本身不复杂时可以单独将该组件拿出使用. 引入依赖 <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-openfeign --> <dependency> <groupId>org.springframework.cloud</groupId>

  • springboot2.x引入feign踩的坑及解决

    目录 springboot2.x引入feign踩的坑 一.需求 二.什么是feign 三.springboot1.x中feign的使用 四.springboot2.x中feign的使用 feign调用方式比较 一.事发原因 二.方式1介绍 三.方式2介绍 四.调用结果测试 五.两种方式对比 六.小结一下 springboot2.x引入feign踩的坑 一.需求 最近公司项目需求,需要调用第三方服务的接口,所以选用了feign来实现(这里只说springboot2.x的pom引用,没有怎么使用,网

  • SpringBoot feign动态设置数据源(https请求)

    目录 1.背景 2.代码 2.2. 编写请求方法 2.3.发送请求 总结: 1.背景 在使用springboot-feign/spingcloud-feign时,需要在启动springboot的时候,注入的方式将feigncofing配置好,也就是说项目启动以后只能有一个数据源,且不能修改,在网上找了很多资料没有找到解决方案(网上应该有,只是我没有找到),后面只能是硬着头皮看源码,问题解决,在此记录一下,希望可以帮到有缘人 2.代码 其实在这里用的原生的feign,并不是springboot/s

  • SpringBoot2.0 整合 Dubbo框架实现RPC服务远程调用方法

    一.Dubbo框架简介 1.框架依赖 图例说明: 1)图中小方块 Protocol, Cluster, Proxy, Service, Container, Registry, Monitor 代表层或模块,蓝色的表示与业务有交互,绿色的表示只对 Dubbo 内部交互. 2)图中背景方块 Consumer, Provider, Registry, Monitor 代表部署逻辑拓扑节点. 3)图中蓝色虚线为初始化时调用,红色虚线为运行时异步调用,红色实线为运行时同步调用. 4)图中只包含 RPC

  • 使用SpringBoot项目导入openfeign版本的问题

    目录 SpringBoot项目导入openfeign版本 版本2.1.1 版本2.2.2 被SpringBoot整合OpenFeign坑惨了 项目集成OpenFegin 解决问题 SpringBoot项目导入openfeign版本 记SpringBoot项目导入spring-cloud-starter-openfeign依赖版本问题 前几天在写项目时,需要微服务间的调用,于是决定使用openfeign. 由于我们的项目使用的是Spring-Boot,版本是2.1.6. 在初次导入openfeig

  • springboot启动feign项目报错:Service id not legal hostnam的解决

    目录 springboot启动feign项目报错:Service id not legal hostnam 在feign项目中,定义接口调用服务 启动时报出异常信息 度娘后发现问题所在 配置文件服务名做同样修改 Service id not legal hostname (pin_user) 错误信息 出现原因 解决方案 springboot启动feign项目报错:Service id not legal hostnam 在feign项目中,定义接口调用服务 @FeignClient(name=

  • SpringBoot通过整合Dubbo解决@Reference注解问题

    首先检查一下你的spring boot版本是多少? 如果是2.X 不用看了,spring boot 2.x 必定会出现这个问题, 改为 1.5.9 或其他1.x版本,目前生产环境建议使用1.x版本. <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9

  • SpringBoot+Dubbo+Seata分布式事务实战详解

    前言 Seata 是 阿里巴巴开源的分布式事务中间件,以高效并且对业务0侵入的方式,解决微服务场景下面临的分布式事务问题. 事实上,官方在GitHub已经给出了多种环境下的Seata应用示例项目,地址:https://github.com/seata/seata-samples. 为什么笔者要重新写一遍呢,主要原因有两点: 官网代码示例中,依赖太多,分不清哪些有什么作用 Seata相关资料较少,笔者在搭建的过程中,遇到了一些坑,记录一下 一.环境准备 本文涉及软件环境如下: SpringBoot

  • SpringBoot与Dubbo整合的方式详解

    1. 使用默认application.properties和注解的方式 导入dubbo-starter,在application.properties配置属性,使用@Service注解来暴露服务,使用@Reference来引用服务.具体可参考 Dubbo整合SpringBoot,这里截取部分代码方便理解. 属性在application.properties中配置 服务提供方使用@Service注解暴露服务 部分配置如"timeout"等可以在注解上添加 服务消费方使用@Referenc

  • 详解Springboot整合Dubbo之代码集成和发布

    本文介绍了Springboot整合Dubbo之代码集成和发布,分享给大家,具体如下: 1. boot-dubbo-api相关 打开boot-dubbo-api项目,正在src/main/java下创建一个包,并创建你需要dubbo暴露的接口TestService.java,并创建一个实体类用于测试User.java.如下图所示: 创建文件和包结构 User.java package com.boot.domain; import lombok.Data; import java.io.Seria

  • springboot2.0整合dubbo的示例代码

    写在前面: 使用springboot作为web框架,方便开发许多,做分布式开发,dubbo又不可少,那么怎么整合在一起呢, 跟我学一遍,至少会用 注意,springboot2.0和springboot1.x与dubbo整合不一样, 1.环境 1.新建一个空的maven项目,作为父工程,新建moudle,,service(接口层,及实现层,没有具体分,),web(web层,springboot项目) 项目结构如下 父pom如下 <properties> <project.build.sou

随机推荐