美文网首页IT@程序员猿媛
Nacos+Dubbo构建微服务示例项目

Nacos+Dubbo构建微服务示例项目

作者: 敬亭阁主 | 来源:发表于2020-08-11 12:22 被阅读0次

    基本结构

    • Nacos:开源的注册中心和配置中心,可直接下载打包应用,启动即可

    • DemoInterface:服务接口定义

    • DemoService:实现服务接口,并注册为Provider

    • DemoClient:服务消费者,通过自动注入服务实例,可直接调用服务接口

    Nacos管理界面

    Nacos

    Nacos-Server部署相对简单,它的发布版本见Github的Releases页面。单机模式在不修改配置的前提下直接启动,使用的是内存数据库,重启后数据会被清空。

    DemoInterface

    这个工程用于在服务的提供者和消费者之间进行一个接口设计,和通常的Java工程没有区别,这里仅列出接口代码。

    public interface DemoService {
        String sayHello(String name);
    }
    

    DemoService

    配置文件application.properties

    #当前服务/应用的名字
    dubbo.application.name  = demo-service-provider
    
    #注册中心的协议和地址
    dubbo.registry.address  = nacos://127.0.0.1:8848
    
    #服务版本及分组名
    dubbo.service.version   = 1.0.0
    dubbo.service.group     = demo
    
    #通信规则(通信协议和接口)
    dubbo.protocol.host     = 127.0.0.1
    dubbo.protocol.name     = dubbo
    dubbo.protocol.port     = 20880
    
    #连接监控中心
    dubbo.monitor.protocol  = registry
    
    #开启包扫描,可替代 @EnableDubbo 注解
    ##dubbo.scan.base-packages=com.apollo.dubbo.Services
    

    Maven依赖

        <dependencies>
            <dependency>
                <groupId>com.apollo.dubbo</groupId>
                <artifactId>DemoInterface</artifactId>
                <version>${project.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo-spring-boot-autoconfigure</artifactId>
            </dependency>
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo-registry-nacos</artifactId>
            </dependency>
            <dependency>
                <groupId>com.alibaba.nacos</groupId>
                <artifactId>nacos-client</artifactId>
            </dependency>
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
        </dependencies>
    

    这里依赖项比较多,尤其是dubbo被贡献给apache后,包名从com.alibaba.dubbo变成了org.apache.dubbo,容易产生混淆,这里统一使用org.apache.dubbo

    启动代码,使用@EnableDubbo注解激活服务注册功能

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

    服务代码,使用@Service注解激活服务定义,注意versiongroup属性都是必须的

    @Service(version = "${dubbo.service.version}", group = "${dubbo.service.group}")
    @Component
    public class DemoServiceImpl implements DemoService {
        /**
         * The default value of ${dubbo.application.name} is ${spring.application.name}
         */
        @Value("${dubbo.application.name}")
        private String serviceName;
    
        public String sayHello(String name) {
            return String.format("[%s] : Hello, %s", serviceName, name);
        }
    }
    

    这里和Spring Cloud不同的是,dubbo服务不一定需要使用Web方式提供服务,缺省的dubbo协议实际上就是RMI协议,效率要比Web方式更高。

    DemoClient

    通常Consumer会对外提供RestWeb接口,内部则通过dubbo协议访问服务提供方。

    配置文件application.properties

    spring.application.name = demo-consumer
    
    # 对外提供的Web服务地址
    server.port             = 8900
    
    dubbo.registry.address  = nacos://127.0.0.1:8848
    
    dubbo.service.version   = 1.0.0
    dubbo.service.group     = demo
    
    dubbo.protocol.host     = 127.0.0.1
    

    Maven依赖

        <dependencies>
            <dependency>
                <groupId>com.apollo.dubbo</groupId>
                <artifactId>DemoInterface</artifactId>
                <version>${project.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo-spring-boot-autoconfigure</artifactId>
            </dependency>
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo-registry-nacos</artifactId>
            </dependency>
            <dependency>
                <groupId>com.alibaba.nacos</groupId>
                <artifactId>nacos-client</artifactId>
            </dependency>
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
        </dependencies>
    

    这里增加了spring-boot-starter-web包,用于对外提供Web服务。

    作为一个标准的SpringBoot应用,启动代码和通常没有区别

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

    消费代码,使用@Reference注解直接进行服务实例的注入

    @RestController
    public class DemoConsumer {
        @Reference(version = "${dubbo.service.version}", group="${dubbo.service.group}")
        private DemoService demoService;
    
        @GetMapping
        public String test() {
            String info = demoService.sayHello("dubbo");
            return info;
        }
    }
    

    Dubbo的消费者代码可以通过接口进行访问,要比Spring Cloud的RestWeb接口访问更直观,也更容易管理。

    其它

    同样的,启动顺序为:Nacos-Server -> DemoService -> DemoClient

    由于该解决方案涉及到了多个开源项目(Nacos,Dubbo,SpringBoot),配置起来略显繁琐,而且由于Dubbo正处于快速发展期,代码也不够稳定,网上许多文章都已过时,开发过程中遇到的问题解决起来比较困难,但是由于Dubbo支持接口方式的消费方式,较好地满足了开发过程的约束要求,同时效率也要优于Web方式的调用,因此可以考虑使用。

    源码已上传码云:com.apollo.dubbo.demo

    相关文章

      网友评论

        本文标题:Nacos+Dubbo构建微服务示例项目

        本文链接:https://www.haomeiwen.com/subject/phwedktx.html