IT@程序员猿媛

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

2020-08-11  本文已影响0人  敬亭阁主

基本结构

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

上一篇下一篇

猜你喜欢

热点阅读