SpringCloudAlibaba 企业级应用实战: Dubbo SpringCloud Nacos 入门案例

Dubbo SpringCloud Nacos 入门案例

案例说明

Dubbo SpringCloud Nacos 入门案例会基于SpringCloudAlibaba 企业级应用实战:基于Nacos 实现服务发现工程来实现。

定义 dubbo 服务接口

public interface IAccountService {

    public Object register(String name);

}

Dubbo 服务接口是服务提供方与消费方的远程通讯契约,为了确保契约的一致性,推荐的做法是将 Dubbo 服务接口打包在第二方或者第三方的 artifact(jar)中。上述接口,存放于sca-account-api工程中。dubbo服务提供方需要引入sca-account-api依赖,并实现服务接口,dubbo服务消费者同样需要引入sca-account-api依赖,并以接口调用的方式实现远程方法调用。

实现 dubbo 服务提供方

dubbo服务提供方是一个独立微服务工程,需要引入sca-account-api依赖,并实现dubbo服务接口。本例中sca-account-service作为dubbo服务提供方。

添加Dubbo Spring Cloud 依赖

<!-- dubbo 服务接口 -->
<dependency>
    <groupId>cn.tyrone.sca</groupId>
    <artifactId>sca-account-api</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

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

<!-- Dubbo Spring Cloud Starter -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>

实现 Dubbo 服务接口

@org.apache.dubbo.config.annotation.Service
public class AccountServiceImpl implements IAccountService {

    public Object register(String name) {
        return name;
    }
    
}

Dubbo 服务提供者配置

server.port=7000
spring.application.name=sca-account-service
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.main.allow-bean-definition-overriding=true
management.endpoints.web.exposure.include=*

dubbo.scan.base-packages=cn.tyrone.sca
dubbo.protocol.name=dubbo
dubbo.protocol.port=-1
dubbo.registry.address=spring-cloud://localhost

配置文件说明:

  • dubbo.scan.base-packages : 指定 Dubbo 服务实现类的扫描基准包
  • dubbo.protocol : Dubbo 服务暴露的协议配置,其中子属性 name 为协议名称,port 为协议端口( -1 表示自增端口,从 20880 开始)
  • dubbo.registry : Dubbo 服务注册中心配置,其中子属性 address 的值 “spring-cloud://localhost”,说明挂载到 Spring Cloud 注册中心

当前 Dubbo Spring Cloud 实现必须配置 dubbo.registry.address = spring-cloud://localhost,下一个版本将其配置变为可选。当前版本:2.1.1.RELEASE

  • spring.application.name : Spring 应用名称,用于 Spring Cloud 服务注册和发现。

该值在 Dubbo Spring Cloud 加持下被视作 dubbo.application.name,因此,无需再显示地配置 dubbo.application.name

  • spring.main.allow-bean-definition-overriding : 在 Spring Boot 2.1 以及更高的版本增加该设定, 因为 Spring Boot 默认调整了 Bean 定义覆盖行为。
  • spring.cloud.nacos.discovery : Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口

Dubbo 服务提供者启动类

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class ScaAccountServiceApplication implements CommandLineRunner {

    Logger logger = LoggerFactory.getLogger(this.getClass());

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

    public void run(String... args) throws Exception {
        logger.info("-------------- 账户应用服务提供者-启动成功 --------------");
    }
}

实现 Dubbo 服务消费方

dubbo服务消费方是一个独立微服务工程,需要引入sca-account-api依赖,并通过接口调用方式调用远程接口。本例中sca-account-consumer作为dubbo服务提供方。

添加Dubbo Spring Cloud 依赖

<!-- dubbo 服务接口 -->
<dependency>
    <groupId>cn.tyrone.sca</groupId>
    <artifactId>sca-account-api</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

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

<!-- Dubbo Spring Cloud Starter -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>

Dubbo 服务消费方配置

server.port=7001
spring.application.name=sca-account-consumer
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.main.allow-bean-definition-overriding=true

dubbo.scan.base-packages=cn.tyrone.sca
dubbo.protocol.name=dubbo
dubbo.protocol.port=-1
dubbo.registry.address=spring-cloud://localhost
dubbo.cloud.subscribed-services=sca-account-service

配置说明:

服务消费方配置增加dubbo.cloud.subscribed-services属性,属性说明如下

  • dubbo.cloud.subscribed-services : 用于服务消费方订阅服务提供方的应用名称的列表,若需订阅多应用,使用 “,” 分割。 不推荐使用默认值为 “*”,它将订阅所有应用。

Dubbo远程服务调用

import cn.tyrone.sca.account.service.IAccountService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;

@RestController
public class AccountConsumerController {

    @Reference private IAccountService accountService;

    @GetMapping("/register")
    public Object register(String name){
        Object object = accountService.register(name);
        return object;
    }

}

Dubbo服务消费方启动类

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
@EnableDiscoveryClient
public class AccountConsumerApplication implements CommandLineRunner {

    Logger logger = LoggerFactory.getLogger(this.getClass());

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

    public void run(String... args) throws Exception {
        logger.info("-------------- 账户应用服务消费者-启动成功 --------------");
    }

    @LoadBalanced
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }


}

测试步骤

  • 启动Nacos服务发现
  • 分别启动Dubbo服务提供方和Dubbo服务消费方。

服务启动成功后,可以在Nacos控制台看到服务列表,如下图:
在这里插入图片描述
浏览器输入:http://localhost:7001/register?name=tyroneHTTP的响应是name的值:tyrone。如下图:
在这里插入图片描述

引用

参考链接:https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/README_CN.md

源代码链接:https://github.com/myNameIssls/spring-cloud-alibaba-study/tree/master/sca-dependences/sca-account

发布了188 篇原创文章 · 获赞 150 · 访问量 65万+

猜你喜欢

转载自blog.csdn.net/myNameIssls/article/details/103751278