😅说来惭愧,刚开始接触dubbo还是从打车项目开始,差不多半年前的事情。
之前虽然多少听说过有这种技术,但是总是觉得事不关己高高挂起,
反正也没用到呢,也没需求,完全没有主动去了解的意愿,
大抵我就是一个Lazy模式的开发者吧 - -!
我总是认为,这些开发的东西,不用,或者用不起来,即使学了,很快也会忘记的。
好吧,既然用到了,那没办法,不得不了解学习下了呢.
既然学了,那就记录一下吧.
Dubbo基础
简介
随着互联网的发展,网站应用的规模不断扩大,访问量及用户量的不断增加,对应用系统的要求会不断的增加。
一般的发展如下:
单一应用架构 (All In One,比如本站点>.<)
--> 垂直应用架构(将应用按功能拆分成各负责一块的独立应用)
--> 分布式服务架构(各个独立应用继续拆分成相对独立的核心服务)
-->流动计算架构(增加对各个分布式集群服务的调度,哪里压力大,就集中资源给那里,动态负载等)
简单说就是这样:
把功能独立的一块service独立提出来,可以独立部署及使用。
比如账号相关的服务,独立出来后,所有其他项目都可以访问这里的账号相关服务,而不用每个项目都来一遍.
类似于公共项目的引用,只不过这里不需要去引用jar包或者啥,
而是每个独立出去的服务都会把自己在一个统一的地方(注册中心)登记下,
而我们引用的时候只需要直接从统一的地方(注册中心)获取一下就好了。
Dubbo使用全 Spring 配置方式,透明化接入应用,对应用没有任何 API 侵入
无缝接入。
官方示例下载
git clone https://github.com/apache/incubator-dubbo.git
cd incubator-dubbo 运行 dubbo-demo-provider中的org.apache.dubbo.demo.provider.Provider
如果使用Intellij Idea 请加上-Djava.net.preferIPv4Stack=true
直接git clone看代码.
provider简单示例
服务service提供方注册。单个项目
使用zookeeper作为注册中心.即所有的服务提供,消费方都从zookeeper上或许目录信息。
pom.xml引入dubbo,zookeeper等.
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.3</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.8</version>
</dependency>
spring 普通service配置
public interface UserService
{
}
...
@Service("userService")
public class UserServiceImpl implements UserService
{
}
application-context.xml中引入dubbo配置,
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:task="http://www.springframework.org/schema/task"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd">
...
<import resource="classpath:spring/dubbo-provider.xml" />
</beans>
spring-dubbo.xml
dubbo申明,暴露userService服务. 把服务登记到zookpeer中.
<?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://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<dubbo:application name="account-provider-front"/>
<dubbo:registry protocol="zookeeper" address="@zookeeper.server@" id="fmsmanager-server"/>
<dubbo:protocol name="dubbo" port="30801" dispatcher="all" threadpool="fixed" accepts="500" threads="100"/>
<dubbo:provider delay="-1" payload="1200000000" timeout="1000000" retries="0"/>
<dubbo:service interface="com.kxjl.account.provider.front.service.UserService" ref="userService"/>
</beans>
启动spring
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"spring/application-context.xml"});
context.start();
synchronized (AccountProviderFrontStartupService.class)
{
while (true)
try
{
AccountProviderFrontStartupService.class.wait();
}
catch (Throwable e) {
e.printStackTrace();
}
}
}
comsumer服务使用方
另外的需要使用dubbo服务的项目.
spring-dubbo.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://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!-- 消费者 -->
<dubbo:application name="account-web-front" />
<dubbo:registry protocol="zookeeper" id="my" address="@zookeeper.server@" />
<!-- 生成远程服务代理,可以和本地bean一样使用 service -->
<dubbo:reference id="userService" interface="com.kxjl.account.provider.front.service.UserService" check="false" registry="my"/>
</beans>
其中注册与使用时,interface名称需要保持一致.
使用跟普通bean一样。
@Controller
@RequestMapping("/user")
public class UserCommonController {
@Autowired
private UserService userService;
.....
}
说白了,就是把service分散开了。
统一认证中心架构
前面使用dubbo处理了几个项目,感觉良好,
刚好这段时间又需要做一个统一认证平台,就完全没有理由不用它嘛。
整体架构
吸取了点前面项目的教训,把公用的bean,mapper都独立出来了。作为独立jar包引入。
区分开前台开发中心,后台管理中心,和oauth认证中心.
bean-mapper
所有的bean,mapper都在这里处理,省去了每个provider里面都搞一遍的麻烦及命令冲突啥的。
但是这个项目打包的配置需要修改一下.
需要把对于的mapper.xml文件引入jar,不然后面部署会找不到文件.
<build>
<finalName>account-provider-oauth</finalName>
<resources>
<resource>
<targetPath>${project.build.directory}/classes</targetPath>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
...
</build>
provider
这里面就简单了,就是各种的service实现。
front-provider
oauth-provider
web
再就是WEB了 ,web可以自由的引用各个provider,互相没有耦合,各自独立。
部署
web独立部署, 前台/后台管理/认证相互独立。
这里前台和oauth认证是共享session的,具体参考本站文章 spring-session应用配置及分布式应用session共享|同站点跨应用session共享
provider独立部署.
最后就是是效果啦
本文基于CC BY-NC-ND 4.0 许可协议发布,作者:野生的喵喵。 固定链接: 【Dubbo小计及基于dubbo的Oauth2.0统一认证平台】 转载请注明
相关文章: