分布式服务治理-Dubbo基础及案例
Provider: 暴露服务的服务提供方。 Consumer: 调用远程服务的服务消费方。 Registry: 服务注册与发现的注册中心。
Monitor: 统计服务的调用次调和调用时间的监控中心。 Container: 服务运行容器。
调用关系说明:
0 服务容器负责启动,加载,运行服务提供者。
1. 服务提供者在启动时,向注册中心注册自己提供的服务。
2. 服务消费者在启动时,向注册中心订阅自己所需的服务。
3. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
4. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
pay-service的pom.xml文件中的关键依赖
<!--工程 pay-service--> <groupId>com.gupaoedu.dubbo</groupId> <artifactId>pay-service</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <!--两个模块 pay-api和pay-provider--> <modules> <module>pay-api</module> <module>pay-provider</module> </modules> <!--引入Pay-api--> <dependencyManagement> <dependencies> <dependency> <groupId>com.gupaoedu.dubbo</groupId> <version>1.0-SNAPSHOT</version> <artifactId>pay-api</artifactId> </dependency> <--!引入dubbo依赖-->
<dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo</artifactId> <version>2.7.2</version> </dependency> </dependencies>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.0.1</version>
</dependency>
<!--Dubbo框架支持多协议,举例webService Rest -->
<!--dubbo支持 发布webService所需要的依赖-->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-simple</artifactId>
<version>3.3.2</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>3.3.2</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId>
<version>9.4.19.v20190610</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-servlet</artifactId>
<version>9.4.19.v20190610</version>
</dependency>
<!--Dubbo支持REST所需要的依赖 JAX-RS CXF / Jersey /RESTEasy-->
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<version>3.8.1.Final</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-client</artifactId>
<version>4.0.0.Final</version>
</dependency>
</dependencyManagement>
pay-api模块
<parent>
<artifactId>pay-service</artifactId>
<groupId>com.gupaoedu.dubbo</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>pay-api</artifactId>
@Path("/pay")
public interface IPayService {
//暴露出去的服务
//完成支付的功能
@GET
@Path("/{info}")
String pay(@PathParam("info") String info);
}
pay-provider模块
<parent>
<artifactId>pay-service</artifactId>
<groupId>com.gupaoedu.dubbo</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<!-- -->
<artifactId>pay-provider</artifactId>
<dependencies>
<!-- -->
<dependency>
<groupId>com.gupaoedu.dubbo</groupId>
<artifactId>pay-api</artifactId>
</dependency>
<!-- -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-simple</artifactId>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-servlet</artifactId>
</dependency>
</dependencies>
web-info下 applications.xml 服务端发布服务
<!-- 提供方应用信息,用于计算依赖关系 --> <dubbo:application name="pay-service"/>
<dubbo:registry id="rg1" address="zookeeper://192.168.13.106:2181"/><!--配置注册中心--> <!-- <dubbo:registry id="rg2" address="zookeeper://192.168.8.125:2181"/><!–配置注册中心–>--> <dubbo:protocol name="dubbo" port="20880"/> <!--支持多协议需要配置的端口号--> <dubbo:protocol name="webservice" port="8080" server="jetty"/> <dubbo:protocol name="rest" port="8888" server="jetty"/> <dubbo:service interface="com.gupaoedu.dubbo.IPayService" ref="payService" protocol="rest" registry="rg1"/>
<bean id="payService" class="com.gupaoedu.dubbo.PayServiceImpl"/>
<!--Dubbo框架支持多协议,需要配置protocol="dubbo,webservice" Protocal省略则直接使用Dubbo协议-->
<dubbo:service interface="com.gupaoedu.dubbo.IQueryService" ref="queryService" protocol="dubbo,webservice" registry="rg1"/>
<bean id="queryService" class="com.gupaoedu.dubbo.QueryServiceImpl"/> </beans>
public class App { public static void main( String[] args ) throws IOException { Main.main(new String[]{"spring","log4j"}); //Dubbo提供的启动类方法,它会启动dobbu中配置的多个container //除了spring里面通过api的方式去加载springxml文件,还有其他方式? } }
public class PayServiceImpl implements IPayService{ //执行支付的服务 @Override public String pay(String info) { System.out.println("execute pay:"+info); return "Hello Dubbo :"+info; } }
client端:order_service
<groupId>com.gupaoedu.dubbo</groupId> <artifactId>order-service</artifactId> <version>1.0-SNAPSHOT</version> <name>order-service</name> <dependencies> <dependency> <groupId>com.gupaoedu.dubbo</groupId> <version>1.0-SNAPSHOT</version> <artifactId>pay-api</artifactId> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo</artifactId> <version>2.7.2</version> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>4.0.1</version> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-recipes</artifactId> <version>4.0.1</version> </dependency> </dependencies>
application.xml 客户端调用服务
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://dubbo.apache.org/schema/dubbo" 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"> <!-- 提供方应用信息,用于计算依赖关系 --> <dubbo:application name="order-service"/> <!--通过缓存实现,在消费端的配置文件中指定如下路径 file="" --> <dubbo:registry id="rg1" address="zookeeper://192.168.13.106:2181" file=""/><!--配置注册中心-->
<!--调用服务--> <dubbo:reference interface="com.gupaoedu.dubbo.IPayService" id="payService" registry="rg1"/>
<dubbo:registry id="rg2" address="zookeeper://192.168.8.126:2181"/><!--配置注册中心-->
</beans>
>发布和调用
<!--发布服务-->
<dubbo:service interface="com.gupaoedu.practice.LoginService" ref="loginService" />
<bean id="loginService" class="com.gupaoedu.practice.LoginServiceImpl" /></beans>
<!--调用服务-->
<dubbo:reference id="loginService" interface="com.gupaoedu.practice.LoginService"
url="dubbo://192.168.13.1:20880/com.gupaoedu.practice.LoginService"/>
Jar 包依赖
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-simple</artifactId>
<version>3.3.2</version>
</dependency> <dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>3.3.2</version>
</dependency> <dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId>
<version>9.4.19.v20190610</version>
</dependency> <dependency>
<groupId>org.eclipse.jetty</groupId><artifactId>jetty-servlet</artifactId>
<version>9.4.19.v20190610</version>
</dependency>
<!-- 用 dubbo 协议在 20880 端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880" /> <dubbo:protocol name="webservice" port="8080" server="jetty"/> <!-- 声明需要暴露的服务接口 --> 添加多协议支持,一个服务可以发布多种协议的支持,也可以实现不同服务发布不同的协议
<dubbo:service interface="com.gupaoedu.practice.LoginService" registry="registryCenter1" ref="loginService" protocol="dubbo,webservice"/>
Jar 包依赖 <dependency> <groupId>org.jboss.resteasy</groupId> <artifactId>resteasy-jaxrs</artifactId> <version>3.8.0.Final</version> </dependency> <dependency> <groupId>org.jboss.resteasy</groupId> <artifactId>resteasy-client</artifactId> <version>3.8.0.Final</version> </dependency> 添加新的协议支持 <dubbo:protocol name="rest" port="8888" server="jetty"/>
@Path("/user")
public interface UserService {
@GET
@Path("/register/{id}")
void register(@PathParam("id") int id);
}
<dubbo:protocol name="rest" port="8888" server="jetty"/>
<dubbo:reference id="userService"
interface="com.gupaoedu.practice.UserService" protocol="rest"/>
下面我们就来看看spring配置方式的写法:
服务提供者:
1. 下载zookeeper注册中心,下载地址:http://www.apache.org/dyn/closer.cgi/zookeeper/ 下载后解压即可,进入D:\apach-zookeeper-3.4.5\bin,
双击zkServer.cmd启动注册中心服务。
2. 定义服务接口: (该接口需单独打包,在服务提供方和消费方共享)
public interface DemoService {
String sayHello(String name);
}
public class DemoServiceImpl implements DemoService{
public String sayHello(String name) {
return "Hello " + name;
}
}
用Spring配置声明暴露服务:

加载Spring配置,启动服务:
public class Provider {
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"applicationContext.xml"});
context.start();
System.in.read(); // 为保证服务一直开着,利用输入流的阻塞来模拟
}
服务消费者:
applicationContext-dubbo.xml 中注册自己需要调用的接口,开始测试的时候需要的接口很多,所以把这个文件写的满满的,后来熟悉了把接口按业务类型分开,写了N多个 applicationContext-dubbo-***.xml 简练多了

加载Spring配置,并调用远程服务:

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

浙公网安备 33010602011771号