Apache Dubbo(以下简称Dubbo)是一款微服务框架,提供服务提供者(Provider)和服务消费者(Consumer)之间的服务发现能力。以Dubbo微服务应用为例,本文介绍如何在本地通过XML配置的方式开发应用,并将其部署到SAE进行托管。
为什么托管到SAE
将Dubbo应用托管到SAE,您仅需关注Dubbo应用自身的逻辑,无需关注注册中心和配置中心的搭建和维护。托管后,您还可以使用SAE提供的弹性伸缩、一键启停、监控等功能,大大降低开发和运维成本。
当您的微服务应用较多时,注册中心按推荐程度由高到低依次排序如下。
准备工作
下载Maven并设置环境变量。
启动Nacos Server。
下载并解压Nacos Server。
进入nacos/bin目录,启动Nacos Server。
Linux、Unix、macOS系统:执行命令
sudo sh startup.sh -m standalone
。Windows系统:执行命令
startup.cmd -m standalone
。
说明standalone
表示单机模式运行,非集群模式。startup.cmd文件默认以集群模式启动,因此您在使用Windows系统时,如果直接双击执行startup.cmd文件会导致启动失败,此时需要在startup.cmd文件内设置MODE="standalone"
。 更多信息,请参见Nacos快速开始。
版本说明
Dubbo 2.7.x, Dubbo 3.0.x 版本的生命周期已于2023年03月结束,请使用新版本开发您的应用。本文以Dubbo 3.2.15版本为例,介绍如何将Dubbo应用托管到SAE。
步骤一:创建服务提供者
创建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>3.2.15</version> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-registry-nacos</artifactId> <version>3.2.15</version> </dependency> <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> <version>1.1.1</version> </dependency> </dependencies>
开发Dubbo服务提供者。
Dubbo中服务都是以接口的形式提供的。
在
src/main/java
路径下创建一个packagecom.alibaba.edas
。在
com.alibaba.edas
下创建一个接口(interface)IHelloService
,里面包含一个SayHello
方法。package com.alibaba.edas; public interface IHelloService { String sayHello(String str); }
在
com.alibaba.edas
下创建一个类IHelloServiceImpl
,实现此接口。package com.alibaba.edas; 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.edas.IHelloService" ref="helloService"/> <bean id="helloService" class="com.alibaba.edas.IHelloServiceImpl"/>
在
provider.xml
中将注册中心指定为本地启动的Nacos Server。<dubbo:registry address="nacos://127.0.0.1:8848" />
127.0.0.1
为Nacos Server的地址。如果您的Nacos Server部署在另外一台机器,则需要修改成对应的IP地址。当将应用部署到SAE后,无需做任何修改,注册中心会替换成SAE上的注册中心的地址。8848
为Nacos Server的端口号,不可修改。
启动服务。
在
com.alibaba.edas
中创建类Provider,并按下面的代码在Provider的main函数中加载Spring Context,将配置好的Dubbo服务暴露。package com.alibaba.edas; 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函数,启动服务。
登录Nacos控制台
http://127.0.0.1:8848
,在左侧导航栏单击服务列表,查看提供者列表。可以看到服务提供者里已经包含了com.alibaba.edas.IHelloService
,且可以查询该服务的服务分组和提供者IP。
步骤二:创建服务消费者
创建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>3.2.15</version> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-registry-nacos</artifactId> <version>3.2.15</version> </dependency> <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> <version>1.1.1</version> </dependency> </dependencies>
开发Dubbo服务提供者。
Dubbo中服务都是以接口的形式提供的。
在
src/main/java
路径下创建Package,命名为com.alibaba.edas
。在
com.alibaba.edas
下创建一个接口(interface)IHelloService
,里面包含一个SayHello
方法。说明通常是在一个单独的模块中定义接口,服务提供者和服务消费者都通过Maven依赖来引用此模块。本文档为了简便,服务提供者和服务消费者分别创建两个完全一模一样的接口,实际使用中不推荐这样使用。
package com.alibaba.edas; public interface IHelloService { String sayHello(String str); }
配置Dubbo服务。
在
src/main/resources
路径下创建consumer.xml
文件并打开。在
consumer.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">
在
consumer.xml
中添加如下配置,订阅Dubbo服务。<dubbo:application name="demo-consumer"/> <dubbo:registry address="nacos://127.0.0.1:8848"/> <dubbo:reference id="helloService" interface="com.alibaba.edas.IHelloService"/>
启动、验证服务。
在
com.alibaba.edas
下创建类Consumer,并按下面的代码在Consumer的main函数中加载Spring Context,订阅并消费Dubbo服务。package com.alibaba.edas; import org.springframework.context.support.ClassPathXmlApplicationContext; import java.util.concurrent.TimeUnit; public class Consumer { public static void main(String[] args) throws Exception { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"consumer.xml"}); context.start(); while (true) { try { TimeUnit.SECONDS.sleep(5); IHelloService demoService = (IHelloService)context.getBean("helloService"); String result = demoService.sayHello("world"); System.out.println(result); } catch (Exception e) { e.printStackTrace(); } } } }
执行Consumer的main函数,启动服务。
验证创建结果。
启动后,可以看到控制台不断地输出
hello world
,表明服务消费成功。登录Nacos控制台
http://127.0.0.1:8848
,在左侧导航栏中单击服务列表,再在服务列表页面选择调用者列表。可以看到包含了
com.alibaba.edas.IHelloService
,且可以查看该服务的服务分组和调用者IP。
步骤三:部署到SAE
在pom.xml文件中,添加应用编译配置,并执行mvn clean package命令将本地程序编译成可执行的JAR包。
Provider
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> <configuration> <classifier>spring-boot</classifier> <mainClass>com.alibaba.edas.Provider</mainClass> </configuration> </execution> </executions> </plugin> </plugins> </build>
Consumer
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> <configuration> <classifier>spring-boot</classifier> <mainClass>com.alibaba.edas.Consumer</mainClass> </configuration> </execution> </executions> </plugin> </plugins> </build>
将编译好的Provider和Consumer应用包部署至SAE。具体操作,请参见在SAE控制台使用JAR文件部署微服务应用。