本文将介绍EOSPlatform+Dubbo+Zookeeper最佳实践的详细情况,。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于(阿里巴巴dubbo,有数
本文将介绍EOSPlatform+Dubbo+Zookeeper最佳实践的详细情况,。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于(阿里巴巴 dubbo, 有数据库,可执行) dubbo zookeeper spring demo、73.springboot + dubbo + zookeeper、dubbo+zookeeper、Dubbo+Zookeeper (二)Dubbo 架构的知识。
本文目录一览:- EOSPlatform+Dubbo+Zookeeper最佳实践
- (阿里巴巴 dubbo, 有数据库,可执行) dubbo zookeeper spring demo
- 73.springboot + dubbo + zookeeper
- dubbo+zookeeper
- Dubbo+Zookeeper (二)Dubbo 架构
EOSPlatform+Dubbo+Zookeeper最佳实践
-
摘要:随着分布式服务框架的流行,许多公司都引入了业界流行的分布式服务框架,本文介绍如何使用EOSPlatform+Dubbo+Zookeeper实现分布式服务的开发与运行。
1 环境准备
1.1 环境选择
EOSPlatform 6.7.1
Zookeeper 3.4.5
Dubbo 2.5.3
Tomcat 5.5.27
1.2 搭建Zookeeper环境
下载zookeeper-3.4.5.tar.gz解压到自定义目录中,如下图:
打开conf目录,将文件zoo_sample.cfg重命名为zoo.cfg。
打开bin目录,用UE打开zkServer.cmd修改如下代码。
setlocal call "%~dp0zkEnv.cmd" set JAVA_HOME=D:\Primeton\JDK1.6 set ZOOMAIN=org.apache.zookeeper.server.quorum.QuorumPeerMain echo on %JAVA_HOME%\bin\java "-Dzookeeper.log.dir=%ZOO_LOG_DIR%" "-Dzookeeper.root.logger=%ZOO_LOG4J_PROP%" -cp "%CLASSPATH%" %ZOOMAIN% "%ZOOCFG%" %* endlocal
1.3 搭建服务监控平台环境
下载dubbo-admin-2.5.3.war,部署到Tomcat5.5.27的应用目录中,路径如下:****\apache-tomcat-5.5.27\webapps\;
1.4 控制台启动运行
先启动zookeeper,再启动tomcat服务器。
通过浏览器访问dubbo-admin应用,用户名/密码(root/root)
如下所示:
内存与注册中心都运行正常说明环境准备完成。
2 EOSPlatform扩展开发
2.1 修复EOS产品中Spring容器的BUG
com.primeton.spring.context.ExtendParentApplicationContext.java中有如下两个方法: /* (non-Javadoc) * @see org.springframework.beans.factory.ListableBeanFactory#getBeansOfType(java.lang.Class) */ public Map getBeansOfType(Class type) throws BeansException { return new HashMap();//防止空指针异常 } /* (non-Javadoc) * @see org.springframework.beans.factory.ListableBeanFactory#getBeansOfType(java.lang.Class, boolean, boolean) */ public Map getBeansOfType(Class type, boolean includePrototypes, boolean allowEagerInit) throws BeansException { return new HashMap();//防止空指针异常 }
红色部分为修改内容,原先返回null值,会导致空指针异常。
2.2 增加启动时开启Spring容器
增加一个启动监听类:SpringContextStartupListener,内容如下:
/** * * 由于分布式服务框架需要初始化Spring容器用于发布订阅服务,因此加入启动过程 * * @author yujl ( yujl+@primeton.com+) */ public class SpringContextStartupListener implements IRuntimeListener { /* (非 Javadoc) * @see com.eos.runtime.core.IRuntimeListener#start(com.eos.runtime.core.RuntimeEvent) */ public void start(RuntimeEvent arg0) { ApplicationContextFactory._getContext_();//预先初始化Spring容器 } /* (非 Javadoc) * @see com.eos.runtime.core.IRuntimeListener#stop(com.eos.runtime.core.RuntimeEvent) */ public void stop(RuntimeEvent arg0) { } }
将SpringContextStartupListener添加到handler-startup.xml文件的结尾部分,如下图所示:
<!- 初始化Spring 容器->
<handler handle-/>
2.3 补充Zookeeper和Dubbo相关jar文件
netty-3.2.5.Final.jar
dubbo-2.5.3.jar
slf4j-api-1.6.1.jar
slf4j-log4j12-1.6.1.jar
zkclient-0.1.jar
zookeeper-3.4.5.jar
将上述jar包放入EOS应用的\WEB-INF\lib目录下。
PS:后面提到的服务提供者应用和服务消费者应用都需要添加Jar包和配置启动文件。
此时EOSPlatform扩展开发完毕。
3 服务提供者示例开发
新建一个EOS项目(项目名称为ProjectProvicer)对应应用为(default_provider);新建一个构件包(名称为:com.primeton.dubbo.provider):
在构件包中新建一个接口示例和一个实现的示例如下:
package com.primeton.dubbo.provider; /** * * 服务提供方接口 * * @author yujl (mailto:yujl@primeton.com) */ public interface DemoService { /** * 这是一个测试 * @param input * @return */ String testHelloWorld(String input); } 接口类DemoService: package com.primeton.dubbo.provider.impl; import org.apache.commons.lang.StringUtils; import com.primeton.dubbo.provider.DemoService; /** * * 服务提供方实现 * * @author yujl (mailto:yujl@primeton.com) */ public class DemoServiceImpl implements DemoService { /* (非 Javadoc) * @see com.primeton.dubbo.provider.DemoService#testHelloWorld(java.lang.String) */ public String testHelloWorld(String input) { if(StringUtils.isBlank(input)){ return "input must not null"; } return "Hello " + input; } }
SpringBean配置编码如下:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:sca="http://www.springframework.org/schema/sca" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/sca http://www.osoa.org/xmlns/sca/1.0/spring-sca.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!-- 提供方应用信息,用于计算依赖关系 --> <dubbo:application name="hello-world-app" /> <!-- 使用multicast广播注册中心暴露服务地址 先不使用注册中心--> <dubbo:registry address="zookeeper://127.0.0.1:2181" /> <!-- 用dubbo协议在20880端口暴露服务 --> <dubbo:protocol name="dubbo" port="20880" /> <!-- 声明需要暴露的服务接口 --> <dubbo:service interface="com.primeton.dubbo.provider.DemoService" ref="demoService" /> <!-- 和本地bean一样实现服务 --> <bean id="demoService"/> </beans>
到此,服务提供者就开发完成了,此时通过导出构件包并部署到Tomcat的default_provider应用当中。
启动服务提供者所在的Tomcat,访问服务监控平台会看到如下界面:
如此, 服务提供者就将服务发布到Zookeeper注册中心当中管理起来了。
4 服务消费者示例开发
新建一个EOS项目(项目名称为ProjectConsumer)对应的应用名称为(default_consumer);新建一个构件包(名称为com.primeton.dubbo.consumer),如下图所示:
首先需要引入服务提供方接口DemoService;
然后增加一个SpringBean用于封装DemoService接口,代码如下:
public class TestDubboAction { private DemoService demoServiceDL; public String sayHello(String input){ if(demoServiceDL != null){ return demoServiceDL.testHelloWorld(input); } return ""; } public DemoService getDemoServiceDL() { return demoServiceDL; } public void setDemoServiceDL(DemoService demoServiceDL) { this.demoServiceDL = demoServiceDL; } }
此类不做任何工作,只是调用DemoService接口。
Spring配置文件修改如下:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:sca="http://www.springframework.org/schema/sca" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/sca http://www.osoa.org/xmlns/sca/1.0/spring-sca.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 --> <dubbo:application name="consumer-of-helloworld-app" /> <!-- 使用multicast广播注册中心暴露发现服务地址 先屏蔽注册中心,通过直连实现 <dubbo:registry address="multicast://224.5.6.7:1234" />--> <dubbo:registry address="zookeeper://127.0.0.1:2181" /> <!-- 生成远程服务代理,可以和本地bean一样使用demoService --> <dubbo:reference id="demoService" interface="com.primeton.dubbo.provider.DemoService"/> <bean id="testDubboAction"> <!-- 和本地服务一样使用远程服务 --> <property name="demoServiceDL" ref="demoService" /> </bean> </beans>
通过Spring配置,将远程服务demoService注入到TestDubboAction中。
然后需要开发两个页面和一个页面流用于调用上述TestDubboAction,具体相关代码参考EOS帮助文档中Spring的配置与开发。
至此,服务消费者也开发完成;通过导出构件包并部署到Tomcat的default_consumer应用当中。
运行服务消费者对应的Tomcat服务器,访问如下页面:
点击 show Greeting按钮,后台通过页面流首先进入TestDubboAction中,如下图所示:
此时我们可以看到代码堆栈为:
Dubbo框架通过Spring配置封装了一个DemoService实例,其实这是一个远程调用的代理客户端。
然后通过Dubbo的协议调用了远端服务,服务方的调用栈为:
服务方也屏蔽了协议的实现,通过代理间接调用了DemoServiceImple实例的testHelloWorld方法。
如此,Dubbo与EOSPlatform无缝结合完成。
查看控制台可以看到服务消费者信息如下:
- 核心技术:Maven,Springmvc mybatis shiro, Druid, Restful, Dubbo, ZooKeeper,Redis,FastDFS,ActiveMQ,Nginx
1. 项目核心代码结构截图
项目模块依赖特别提醒:开发人员在开发的时候可以将自己的业务REST服务化或者Dubbo服务化
2. 项目依赖介绍
2.1 后台管理系统、Rest服务系统、Scheculer定时调度系统依赖如下图:
2.2 Dubbo独立服务项目依赖如下图:
3. 项目功能部分截图:
zookeeper、dubbo服务启动
dubbo管控台
REST服务平台
(阿里巴巴 dubbo, 有数据库,可执行) dubbo zookeeper spring demo
源码下载 http://download.csdn.net/download/knight_black_bob/9439432
windows zookeeper 下载地址 http://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.6/
修改zookeeper配置文件zoo-example.cfg改为zoo.cfg,zookeeper默认寻找zoo.cfg配置文件
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
#dataDir=/tmp/zookeeper
dataDir=F:\\log\\zookeeper\\data
dataLogDir=F:\\log\\zookeeper\\log
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
启动zookeeper
Window下命令:进入bin目录 ->zkServer.cmd
配置 <dubbo:registry id="zk1" address="quickstart.cloudera:2181" protocol="zookeeper" />
测试成功
,provider 发布 后 ,linux 下 zookeeper path 会增加。 zookeeper 起到 注册中心,服务发现的作用
consumer 测试结果:
provider 发布,(这是一种发布方式)
applictionContext-dubbo-provider.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!-- 提供方应用名称信息,这个相当于起一个名字,我们dubbo管理页面比较清晰是哪个应用暴露出来的 -->
<dubbo:application name="curiousby-dubbo-provider"/>
<!-- 提供方应用名称信息,这个相当于起一个名字,我们dubbo管理页面比较清晰是哪个应用暴露出来的 -->
<!-- 使用zookeeper注册中心暴露服务地址 -->
<dubbo:registry id="zk1" address="192.168.16.21:2181,192.168.16.29:2181,192.168.16.30:2181" protocol="zookeeper" />
<!-- 使用multicast广播注册中心暴露服务地址 -->
<!--<dubbo:registry address="multicast://224.5.6.7:1234" /> -->
<!-- 用dubbo协议在20886端口暴露服务 -->
<dubbo:protocol id="mydubbo" name="dubbo" port="20886" />
<dubbo:provider registry="zk1" protocol="mydubbo"/>
<!-- 声明需要暴露的服务接口 -->
<dubbo:service interface="com.baoy.service.UserService" ref="userServiceImpl" />
</beans>
applictionContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:oscache="http://www.springmodules.org/schema/oscache"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springmodules.org/schema/oscache
http://www.springmodules.org/schema/cache/springmodules-oscache.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd">
<!-- 对web包中的所有类进行扫描,以完成Bean创建和自动依赖注入的功能 -->
<mvc:annotation-driven />
<!-- 扫描包 -->
<context:annotation-config />
<!-- import the properties -->
<context:property-placeholder location="classpath:jdbc.properties" />
<context:component-scan base-package="com.baoy" />
<!-- 配置數據源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<!-- 连接池启动时的初始值 -->
<property name="initialSize" value="${jdbc.initialSize}" />
<property name="maxActive" value="${jdbc.maxActive}" />
<property name="maxIdle" value="${jdbc.maxIdle}" />
<property name="minIdle" value="${jdbc.minIdle}" />
</bean>
<!-- 配置jdbcTemplate模板 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 配置 transactionManager事物管理 -->
<!-- <bean id="transactionManager">
<property name="dataSource" ref="dataSource" /> </bean> -->
<!-- Spring AOP config配置切点 -->
<!-- <aop:config> <aop:pointcut expression="execution(* cmcc.picrepository.service.*.*(..))"
id="bussinessService" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="bussinessService"
/> </aop:config> -->
<!-- 配置那个类那个方法用到事务处理 -->
<!-- <tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes> <tx:method name="search*" read-only="true" /> <tx:method
name="find*" read-only="true" /> <tx:method name="get*" read-only="true"
/> <tx:method name="add*" propagation="REQUIRED" /> <tx:method name="save*"
propagation="REQUIRED" /> <tx:method name="update*" propagation="REQUIRED"
/> <tx:method name="delete*" propagation="REQUIRED" /> <tx:method name="*"
propagation="REQUIRED" /> </tx:attributes> </tx:advice> -->
</beans>
package com.baoy.service;
import java.util.List;
import com.baoy.bean.User;
/**
* @author baoyou E-mail:curiousby@163.com
* @version 2016年2月22日 上午10:24:23
*
* desc: ...
*/
public interface UserService {
public List<User> getAllUsers();
public void delUserById(int userId);
public User getUserById(int userId);
public void updateUser(User user);
public void addUser(User user);
}
package com.baoy.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.baoy.bean.User;
import com.baoy.dao.UserDao;
import com.baoy.service.UserService;
/**
* @author baoyou E-mail:curiousby@163.com
* @version 2016年2月22日 上午10:24:54
*
* desc: ...
*/
@Component
public class UserServiceImpl implements UserService {
@Autowired
UserDao userDao;
public List<User> getAllUsers() {
return userDao.getAllUsers();
}
public void delUserById(int userId) {
userDao.delUserById(userId);
}
public User getUserById(int userId) {
return userDao.getUserById(userId);
}
public void updateUser(User user) {
userDao.updateUser(user);
}
public void addUser(User user) {
userDao.addUser(user);
}
}
provider 发布,上面有一种发布方式
package com.baoy.main;
import java.io.IOException;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @author baoyou E-mail:curiousby@163.com
* @version 2016年2月22日 下午4:44:44
*
* desc: ...
*/
public class Start {
public static void main(String[] args) throws IOException {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
new String[] { "classpath*:META-INF/spring/applictionContext.xml",
"classpath*:META-INF/spring/applictionContext-dubbo-provider.xml" });
context.start();
System.in.read(); // 按任意键退出
}
}
appliction-dubbo-consumer.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<dubbo:application name="curiousby-dubbo-consumer"/>
<dubbo:registry id="zk1" address="192.168.16.21:2181,192.168.16.29:2181,192.168.16.30:2181" protocol="zookeeper" />
<dubbo:consumer registry="zk1"/>
<dubbo:reference id="userService" interface="com.baoy.service.UserService"/>
</beans>
appliction.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:oscache="http://www.springmodules.org/schema/oscache"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springmodules.org/schema/oscache
http://www.springmodules.org/schema/cache/springmodules-oscache.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd">
<context:annotation-config />
<context:component-scan base-package="com.baoy.test" />
</beans>
package com.baoy.test;
import java.util.List;
import javax.annotation.Resource;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.baoy.bean.User;
import com.baoy.service.UserService;
/**
* @author baoyou E-mail:curiousby@163.com
* @version 2016年2月22日 下午1:48:37
*
* desc: ...
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:appliction.xml","classpath:appliction-dubbo-consumer.xml"})
public class ConsumerTest {
@Resource
UserService userService;
@Test
public void allUsersTest() {
List<User> allUsers = userService.getAllUsers();
System.out.println("\r\n\r\n\r\n"+allUsers.toString()+"\r\n\r\n\r\n");
}
}
捐助开发者
在兴趣的驱动下,写一个免费
的东西,有欣喜,也还有汗水,希望你喜欢我的作品,同时也能支持一下。 当然,有钱捧个钱场(右上角的爱心标志,支持支付宝和 PayPal 捐助),没钱捧个人场,谢谢各位。
谢谢您的赞助,我会做的更好!
73.springboot + dubbo + zookeeper
1. doubbo 管理台 搭建 https://my.oschina.net/springMVCAndspring/blog/2050933
2.zookeeper安装 https://my.oschina.net/springMVCAndspring/blog/2050353
1.效果
2. 生产者
2.1 pom.xml
<!--7.dubbo依赖--> <dependency> <groupId>com.alibaba.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>0.2.0</version> </dependency> <dependency> <groupId>com.alibaba.spring.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.0.0</version> </dependency> <!--8.zkclient依赖--> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.10</version> </dependency>
2.2 配置文件
server.port=6666 dubbo.application.name=dubbo-producer dubbo.registry.address=zookeeper://localhost:2181 dubbo.protocol.name=dubbo dubbo.protocol.port=20880 dubbo.scan.basePackages=cn.ma.scz.service #dubbo.monitor.protocol=registry
2.3 3 层代码
2.3.1 controller
2.3.2 service
接口还是原来那样,实现类的注解用dubbo的
2.3.3 mapper
略.....
3.消费者
3.1 导入jar
<!--7.dubbo依赖--> <dependency> <groupId>com.alibaba.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>0.2.0</version> </dependency> <dependency> <groupId>com.alibaba.spring.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.0.0</version> </dependency> <!--8.zkclient依赖--> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.10</version> </dependency>
3.2 配置文件
## Dubbo 服务消费者配置 dubbo.application.name=order-service-consumer dubbo.registry.address=zookeeper://localhost:2181 #dubbo.monitor.protocol=registry
3.3 代码
3.3.1 controller
3.3.2 (重要) service层
4.代码
链接:https://pan.baidu.com/s/1N0B-Z2_DmKmqK7WnDTI-Bw
提取码:ksue
dubbo+zookeeper
zookeeper 安装
单击模式
集群模式
dubbo demo
Consumer
registry 配置
Pom配置
运行配置
Provider
同Consumer
链接
Zookeeper 安装
Zookeeper 官网
官网
Dubbo 教程
Dubbo+Zookeeper (二)Dubbo 架构
dubbo 架构上次更新博客已经是一年前,这一年发生了很多事,并不顺利,甚至有些痛苦,不过不管怎样,不要停止学习,只有学习才能让你变强,应对更多不安定。
一、RPC 概念
Dubbo 服务是一个 RPC 框架,那我们首先就要先理解什么叫做 RPC, Remote Procedure Call 即远程过程调用。
远程过程调用相对的是本地过程调用,本地过程调用就不用说了,简单理解成本地方法调用函数即可,而远程调用是指调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数。而不用程序员显式编码这个远程调用的细节。即程序员无论是调用本地的还是远程的函数,本质上编写的调用代码基本相同。
RPC 的基本架构图如下:
RPC 框架就是图中的 client stub 和说 server stub,服务间要相互调用,需要先建立连接。当客户端调用 client stub,可能需要传递参数,而在网络间传递,需要进行序列化,序列化完全后将需要调用的消息发送给 server stub,服务端收到信息后,先反序列化,然后再调用本地服务,调用完本地服务后,返回处理结果,结果也需要进行序列化,序列化完成之后再返回消息,而 client stub 收到消息,也需要再次反序列化,再转换成调用结果,这就是一个完整的 RPC 过程,如图所示:
RPC 框架就是要实现像那小助手一样的东西,目的就是让我们使用远程调用像本地调用一样简单方便,并且解决一些远程调用会发生的一些问题 ,对于我们来说是无感知的。
在示例图中我们也可以看出,RPC 的核心模块就是通讯,序列化。
那如果让我们来设计一个 RPC 框架,我们的设计思路应该是怎么样的呢?
首先从服务调用者开始,这是一个消费方,我们要消费一个服务,那么这种服务应该是一个接口形式的,这个接口一般是一个公用 jar 包来定义,当我知道需要调用什么接口时,具体的实现不需要清楚,这些都应该是框架代理来做的,我只需要带接口和参数即可。
消费方不需要知道其中细节,不需要知道要调用那台服务器上的服务,这个时候应该有一个注册中心,这个注册中心有点类似公司大楼的前台物业,他负责指引来客人找到找入驻本栋大楼的公司,每个公司类似服务提供者,公司入驻大大楼后,将自己的楼层和门牌号告诉前台,前台把公司的情况贴在前台指引,那么当有人要找到公司提供服务时,可以直接通过门牌找到想要去的公司,而这个公司搬走后,前台物业又将此公司去掉,消费者需要的服务器是可以直接找到对应公司。
当然,如果你直接告诉了客户你的具体位置,那么客户可以不需要去注册中心找你,也就是注册中心可以不需要。
那作为服务提供者,你要告诉别人你公司能提供的服务器,去实现对应的接口 ,然后暴露出去,也就是去向注册中心注册自己,暴露自己所能提供的服务。 然后有消费者请求过来需要处理,提供者需要用和消费者协商好的协议来处理这个请求,然后做反序列化。
面对众多的服务,精细化的监控和方便的运维必不可少。 这个时候我们需要监控运维 ,也就是监控中心,当然如果你要这么莽,就是不需要监控,当然也是可以的。
到此,我们能想到的架构就是如此,接下里我们就来看看 dubbo 设计(当然,我是通过实际架构反推出来,手动狗头)
二、Dubbo 核心概念
Dubbo 是阿里巴巴 2011 年开源的一个基于 Java 的 RPC 框架,中间沉寂了一段时间,不过其他一些企业还在用 Dubbo 并自己做了扩展,比如当当网的 Dubbox,还有网易考拉的 Dubbok。
在 2018 年和 Dubbox 进行了合并,并且进入 Apache 孵化器,在 2019 年正式成为 Apache 顶级项目。
学习一门技术,如果有官网的话我们尽量从官网上学习:首先我们要知道 Dubbo 有哪些特性:
面向接口代理的高性能 RPC 调用: 提供高性能的基于代理的远程调用能力,服务以接口为粒度,为开发者屏蔽远程调用底层细节。
智能负载均衡: 内置多种负载均衡策略,智能感知下游节点健康状况,显著减少调用延迟,提高系统吞吐量。
服务自动注册与发现: 支持多种注册中心服务,服务实例上下线实时感知。
高度可扩展能力: 遵循微内核 + 插件的设计原则,所有核心能力如 Protocol、Transport、Ser.........
今天的关于EOSPlatform+Dubbo+Zookeeper最佳实践的分享已经结束,谢谢您的关注,如果想了解更多关于(阿里巴巴 dubbo, 有数据库,可执行) dubbo zookeeper spring demo、73.springboot + dubbo + zookeeper、dubbo+zookeeper、Dubbo+Zookeeper (二)Dubbo 架构的相关知识,请在本站进行查询。
本文标签: