本文以包含服务提供者和服务消费者的Dubbo微服务应用为例,让您快速体验如何在MSE上构建Nacos、ZooKeeper和Eureka等服务注册中心,实现应用的服务注册与发现,以及消费者对提供者的调用。
准备工作
在开始开发前,请确保您已经完成以下工作:
创建服务提供者
在本地创建一个提供者应用工程,添加依赖,配置服务注册与发现,并将注册中心指定为Nacos。
创建Maven项目并引入依赖。
使用IDE(如IntelliJ IDEA或Eclipse)创建一个Maven项目。
在pom.xml文件中添加dubbo、dubbo-registry-nacos和nacos-client依赖。
<dependencies> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo</artifactId> <version>2.7.9</version> </dependency> <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> <version>1.4.2</version> </dependency> </dependencies>
开发Dubbo服务提供者。
Dubbo中服务都是以接口的形式提供的。
在
src/main/java
工程路径下创建一个package,命名为com.alibaba.mse
。在
com.alibaba.mse
下创建一个接口(interface)IHelloService,里面包含一个SayHello方法。package com.alibaba.mse; public interface IHelloService { String sayHello(String str); }
在com.alibaba.mse下创建一个类IHelloServiceImpl,实现此接口。
package com.alibaba.mse; public class IHelloServiceImpl implements IHelloService { public String sayHello(String str) { return "hello " + str; } }
配置Dubbo服务。
在
src/main/resources
路径下创建provider.xml文件并打开。在
provider.xml
中,添加Spring相关的XML Namespace(xmlns)和XML Schema Instance(xmlns:xsi),以及Dubbo相关的Namespace(xmlns:dubbo)和Schema Instance(xsi:schemaLocation)。<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://dubbo.apache.org/schema/dubbo" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
在provider.xml中将接口和实现类暴露成Dubbo服务。
<dubbo:application name="demo-provider"/> <dubbo:protocol name="dubbo" port="28082"/> <dubbo:service interface="com.alibaba.mse.IHelloService" ref="helloService"/> <bean id="helloService" class="com.alibaba.mse.IHelloServiceImpl"/>
在provider.xml中将注册中心指定为本地启动的Nacos Server。
<dubbo:registry address="nacos://mse.XX.nacos.mse.aliyuncs.com:8848" />
说明若您选择使用公网域名,请清空白名单。相关操作,请参见设置白名单。
在实例列表的访问方式列,查看在MSE上传创建的Nacos的外网访问地址,格式为
mse.XX.nacos.mse.aliyuncs.com
。说明如果您使用的服务注册中心是MSE的Zookeeper,那么您需要将本步骤的注册中心代码替换成Zookeeper相应的代码,具体代码详情请参见微服务注册配置中心使用说明。
启动服务。
在com.alibaba.mse中创建类Provider,并按下面的代码在Provider的main函数中加载Spring Context,将配置好的Dubbo服务暴露。
package com.alibaba.mse; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Provider { public static void main(String[] args) throws Exception { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"provider.xml"}); context.start(); System.in.read(); } }
执行Provider的main函数,启动服务。
验证结果。
登录MSE注册中心控制台。
在左侧导航栏,选择
,并在实例列表页单击已创建的MSE实例。设置MSE引擎访问白名单。
如果没有填写任何IP地址及掩码,表示允许所有地址均可访问该实例。
在实例详情页面的左侧导航栏,选择
,在服务列表中,如果存在Provider服务,表示该服务注册成功。
创建服务消费者
在本地创建一个Spring Boot
消费者应用工程,添加依赖,添加订阅服务的配置。
创建Maven项目命名为spring-boot-dubbo-consumer
并引入依赖。
使用IDE(如IntelliJ IDEA或Eclipse)创建一个Maven项目。
在
pom.xml
文件中添加dubbo-spring-boot-starter
和nacos-client
依赖,这里以Spring Boot 2.4.2为例。<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.4.2</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-actuator</artifactId> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.7.3</version> </dependency> <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> <version>1.1.1</version> </dependency> </dependencies>
开发Dubbo消费者。
在
src/main/java
路径下创建packagecom.alibaba.mse
。在
com.alibaba.mse
下创建一个接口(interface)IHelloService
,里面包含一个SayHello
方法。package com.alibaba.mse; public interface IHelloService { String sayHello(String str); }
开发Dubbo服务调用,需要在Controller中调用一次远程Dubbo服务,开发的代码如下所示。
package com.alibaba.mse; import com.alibaba.dubbo.config.annotation.Reference; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class DemoConsumerController { @Reference private IHelloService demoService; @RequestMapping("/sayHello/{name}") public String sayHello(@PathVariable String name) { return demoService.sayHello(name); } }
说明这里的@Reference注解是com.alibaba.dubbo.config.annotation.Reference。
在
application.properties
配置文件中新增以下配置。server.port=8080 dubbo.application.name=dubbo-consumer-demo dubbo.registry.address=nacos://mse.XX.nacos.mse.aliyuncs.com:8848
说明dubbo.registry.address
的值前缀必须以nacos://
开头,后面的IP地址和端口为MSE Nacos Server的地址。开发并启动Spring Boot入口类
SpringBootDubboConsumerApplication
。package com.alibaba.mse; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class SpringBootDubboConsumerApplication { public static void main(String[] args) { SpringApplication.run(SpringBootDubboConsumerApplication.class, args); } }
验证结果。
登录MSE注册中心控制台。
在左侧导航栏,选择
,并在实例列表页单击已创建的MSE实例。设置MSE引擎访问白名单。
如果没有填写任何IP地址及掩码,表示允许所有地址均可访问该实例。
在实例详情页面的左侧导航栏,选择
,在服务列表中,如果存在Consumer服务,表示该服务注册成功。
结果验证
执行curl http://localhost:8080/sayHello/mse
,如果结果返回Hello, mse
,表示Consumer与Provider业务调用成功。
`curl http://localhost:8080/sayHello/mse`
`Hello, mse`