SpringCloud alibaba之Nacos作为注册中心同时集成Dubbo和Openfegin搭建Demo【windos环境】

 Nacos官方文档:https://nacos.io/zh-cn/docs/v2/quickstart/quick-start.html
一、下载与启动
先从官方文档地址下载nacos注册中心,默认点击startup.cmd是集群模式启动,解压后在bin目录下输入cmd进入命令行,这里我们使用单机模式启动startup.cmd -m standalone


启动后进入:http://127.0.0.1:8848/nacos 管理界面查看,nacos默认账号密码都是nacos
二、Nacos集成Dubbo、OpenFeign
新建生产者模块并添加nacos、dubbo、openfeign相关依赖,编写application.yml配置文件
    <properties>
        <spring.boot.version>2.7.13</spring.boot.version>
        <spring.cloud.version>3.1.5</spring.cloud.version>
        <dubbo.version>3.2.3</dubbo.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <version>${spring.boot.version}</version>
            </dependency>

            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
                <version>2021.0.5.0</version>
            </dependency>

            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-core</artifactId>
                <version>2.13.2</version>
            </dependency>

            <!--cloud相关-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-openfeign</artifactId>
                <version>${spring.cloud.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-loadbalancer</artifactId>
                <version>3.1.5</version>
            </dependency>

            <!--dubbo-->
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo-spring-boot-starter</artifactId>
                <version>${dubbo.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo-registry-nacos</artifactId>
                <version>${dubbo.version}</version>
            </dependency>

            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.18.28</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

所需依赖如上,需要注意SpringBoot和Nacos、Dubbo需要对应的版本关系才能正常启动。本文使用的是SpringBoot 2.7.13 + SpringCloud 3.1.5 + Nacos 2021.0.5 + Dubbo3.2.3。

SpringCloudAlibaba相关组件版本说明:版本说明 · alibaba/spring-cloud-alibaba Wiki · GitHub

(1)服务提供者模块

yml配置文件如下:

server:
  port: 8001

spring:
  application:
    name: provider   #  应用名
  cloud:             ## nacos服务地址
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
  main:
    # Spring Boot2.1及更高的版本需要设定
    allow-bean-definition-overriding: true

dubbo:
  scan:
    base-packages: com.cloud.service
  protocol:
    port:
      20881
  registry:
    address: nacos://127.0.0.1:8848


完成配置后编写Dubbo接口,Dubbo接口需要使用@DubboService注解
package com.cloud.service;


import org.apache.dubbo.config.annotation.DubboService;

@DubboService
public class DubboTestServiceImp implements DubboTestService {

    @Override
    public String dubboTest() {
        return "我是服务提供者:这是一个dubbo测试";
    }
    
}

Controller层定义两个接口,用来给消费者用openFeign的方式调用

package com.cloud.controller;

import com.cloud.vo.TestVO;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/provider")
public class ProviderTest {

    @Value("${server.port}")
    private String port;

    @GetMapping("/opfeign-get-send")
    public String sendGet() {
       return "我是服务提供者:"+port;
    }

    @PostMapping("/openfeign-post-send")
    public String sendPost(@RequestBody TestVO testVO) {
        return testVO.toString();
    }

}

在启动类加上@EnableDubbo注解

package com.cloud;

import org.apache.dubbo.config.spring.context.annotation.DubboComponentScan;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@EnableDubbo
@DubboComponentScan
public class CloudServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(CloudServerApplication.class, args);
    }
}

启动服务后登录Nacos管理界面查看提供者服务是否注册成功,可以看到服务列表已存在

(2)消费者模块
Dubbo服务注册到nacos后,新建消费者模块consumer,同样添加和提供者相同依赖和编写application.yml配置文件如下
server:
    port: 8002

spring:
    application:
        name: consumer   #  应用名
    cloud:             ## nacos服务地址
        nacos:
            discovery:
                server-addr: 127.0.0.1:8848

dubbo:
    registry:
        address: nacos://127.0.0.1:8848
# dubbo 协议
    protocol:
        name: dubbo
    port: -1                            #端口号自增
    cloud:
        subscribed-services: provider   #订阅服务提供者
    scan:
        base-packages: com.cloud.service
    application:
        qosEnable: true
        qosPort: 33333                 #默认qos端口服务提供者已经使用需指定
        qosAcceptForeignIp: false     

feign:
    hystrix:
        enable: true                   #开启服务熔断

编写和服务提供者相同Dubbo接口,注意:包名也要和提供者一致,不然启动消费者后会找不到服务提供接口。
package com.cloud.service;

public interface DubboTestService {
    public String dubboTest();
}

接下来新建Feign接口用来调用远程服务,OpenFign加入了SpringMVC的注解,使用起来只要保持和服务提供者接口保持一致就可以了,@FeignClient的value代表提供者服务名

package com.cloud.feign;

import com.cloud.feginvo.TestVO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;


@FeignClient(value = "provider") 
public interface ProviderFeign {
    @GetMapping("/provider/opfeign-get-send")
    String send();
    
    @PostMapping("/provider/openfeign-post-send")
    String sendPost(@RequestBody TestVO testVO);
}

启动类需要加上@ EnableFeignClients注解

package com.cloud;

import org.apache.dubbo.config.spring.context.annotation.DubboComponentScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication
@EnableFeignClients
@DubboComponentScan
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class,args);
    }
}
三、测试

编码完成之后我们测试一下在消费者中调用远程服务,这里需要添加Junit和springbootTest相关依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <version>2.7.13</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
            <scope>test</scope>
        </dependency>

添加单元测试

import com.cloud.ConsumerApplication;
import com.cloud.feginvo.TestVO;
import com.cloud.feign.ProviderFeign;
import com.cloud.service.DubboTestService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;

@SpringBootTest(classes = ConsumerApplication.class)
@RunWith(SpringRunner.class)
public class RemoteTest {
    @Resource
    private ProviderFeign feignclint;
    @DubboReference
    private DubboTestService dubboService;

    @Test
    public void dubboTest() {
        String response = dubboService.dubboTest();
        System.out.println(response);
    }

    @Test
    public void feignGetTest() {
        String response = feignclint.send();
        System.out.println(response);
    }

    @Test
    public void feignPostSend() {
        TestVO testVO = new TestVO("aa", "bb");
        String response = feignclint.sendPost(testVO);
        System.out.println(response);
    }
}

测试结果如下,分别在消费者测试Dubbo和Oenfign的远程调用都成功 

Demo项目结构如下

四、总结

Dubbo和OpenFeign都是Java中比较流行的RPC框架,它们的作用都是为了方便不同的服务之间进行远程调用。但是它们之间还是有一定的区别的。

(1)通信方式不同

Dubbo的通信方式是基于TCP长连接的,而OpenFeign则是基于HTTP的RESTful API调用。这就决定了它们在网络通讯上的差异,Dubbo相对来说更适合在局域网内进行服务调用,而OpenFeign也更适合在不同地区,不同系统之间进行服务调用。

(2)功能和特性不同

Dubbo提供了更完整的分布式服务治理方案,包括服务发现、负载均衡、容错、路由、监控等功能,而OpenFeign则主要关注于服务调用的API设计和声明式的接口调用,没有Dubbo那么强大的治理能力。

(3)使用场景不同

基于以上两点区别,Dubbo更适合于微服务架构方案下的RPC调用,服务数量巨大、网络环境复杂的场景,而OpenFeign更适合于RESTful风格的API调用,能够方便地与不同的编程语言进行交互,更加适合于快速原型开发和轻量级的应用开发。

总之,Dubbo和OpenFeign都有自己适合的使用场景和优势,具体选择哪个框架取决于项目的需求和技术架构方案。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值