赞
踩
传统单体架构:所有的服务都部署在一台服务器上,如图:
在互联网的发展过程中,在以前,我们只需要一个服务器,将程序全部打包好就可以,但是,随着流量的增大,常规的垂直应用架构已无法应对,所以,架构就发生了演变。
所有的功能都写在一个工程中,规模巨大,不好,更新维护麻烦,项目访问量大时,需要许多服务器,可能访问量大是某些模块的请求多。
同时对于项目的拓展也有阻力,当项目变更时,所有的服务器都必须要进行变更,矛盾更加的剧烈。
Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。
RPC是指远程调用,举例:2台服务器A,B,A服务器上的应用想调用B服务器上的方法,由于不再一个内存中,不能直接调用,需要通过网络来表达调用和传递调用的数据。
简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求,
并且本质上是个服务调用的东西,说白了就是个远程服务调用的分布式框架。
dubbo架构图如下所示: - 原理图
节点角色说明:
Provider: 暴露服务的服务提供方。
Consumer: 调用远程服务的服务消费方。
Registry: 服务注册与发现的注册中心。
Monitor: 统计服务的调用次调和调用时间的监控中心。
Container: 服务运行容器。
调用关系说明:
0 服务容器负责启动,加载,运行服务提供者。
1 服务提供者在启动时,向注册中心注册自己提供的服务。
2 服务消费者在启动时,向注册中心订阅自己所需的服务。
3 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
4 服务消费者,从提供者地址列表中,选一台提供者进行调用,如果调用失败,再选另一台调用。
5 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
在另外一个文档中有详细的说明,
注意:zookeeper服务启动之后就不能停掉了,而且要在服务的提供者和消费者之前就启动好注册中心
在另外一个文档,dubbo-admin
新建一个简单的maven项目进行管理:
在自己的workspace中新建一个项目,当前项目就是一个总的管理中心,在这个项目中不会写任何的代码,所有的代码都是写在provider中和consumer中。
所以一般情况下,这个项目只需要是一个简单的maven项目即可,我们也会将当前项目中的src目录进行删除。只会保留最基本的项目架构。
Provider是服务的提供者, mvc -- model
Consumer是消息的消费者 mvc - controller
注意:在启动provider和consumer之前,必须要启动注册中心,这样启动的服务才会在注册中心被注册和发现。
创建项目来进行管理:
编写父级项目
选择自己的mvn
信息核对
因为这个父项目主要是做管理的,不会有任何代码出现,所以将src直接删掉即可
将一些提供者和消费都需要使用的内容我们可以存放在公共模块中,比如pojo相关内容和对外暴露的service接口,以及一些工具类的相关内容等。
这些信息在provider中需要,在consumer中同样是需要的,如果隐藏的话,那么在这些模块中都需要编写,比较麻烦,
所以直接将这些内容放在公共模块中,这样需要的话直接引入即可。
右击项目,新建模块(module)
因为module里存放的时pojo和service,因此我们只需要构建普通工程即可
Provider 是服务的提供者,可以理解为mvc开发模式中的M, 就是从service以后的所有的内容都写在这个项目下。
模块直接使用springboot的模板创建,因为是一个提供者,所以需要将mybatis相关的内容和数据库相关的内容也一起勾上。
注意:虽然是provider模块,但是web相关的内容也还是要勾上的。
点击项目名,然后右击,新建一个模块(module)
和构建提供者provider一样的方式去构建调用者consumer,
在选择模板的时候,因为只需要和客户端的浏览器进行交互,我们只需要选择一个web即可。
因为我们的数据都是来源于provider,所以不需要连接数据库的相关内容。
构建结束后的项目结构如下
到目前为止,咱们就创建好了相关的模块的服务提供者和消费者,同时也抽取了公共的模块内容。接下来就是编写和配置了
这里还是以我们熟悉的user为例,在公共模块下新建User类,包名为com.sky.pojo.
注意:pojo类必须要实现序列化接口
在common工程中的java文件夹下的com.sky.service包下构建接口UserService,内容如下
到这里咱们就完成了公共模块的一些内容的编写,pojo是共用的内容,service接口是对外暴露的服务,实现的细节需要隐藏起来,我们在provider中进行实现。
在pom中我们需要引入公共模块的内容,dubbo和zookeeper相关的依赖都需要添加进来
将下面的内容添加到pom的依赖中:
<!-- 公共模块的引入-->
<dependency>
<groupId>com.sky</groupId>
<artifactId>common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--这是微服dubbo的核心服务包-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.3</version>
<exclusions>
<exclusion>
<artifactId>spring</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
<!--这是zookeeper的服务操作包 但主要这里的版本最好和你的zookeeper版本一致-->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
<exclusions>
<exclusion>
<artifactId>slf4j-log4j12</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<!--这里是zookeeper的zkCli的操作包 我们读写服务全靠这个包-->
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
在provider下新建一个service包和mapper包,service包中的UserServiceImpl需要实现公共模块的UserService接口,在mapper包下新建UserMapper接口
并且在resources下新建mapperxml文件夹,在该文件夹下新建UserMapper.xml
内容其实和以前是一样的。
编写在provider工程下的resouces文件夹下新建spring-provider.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="userprovider"/>
<!-- 使用zookeeper注册中心暴露服务地址,我的zookeeper是架在本地的 -->
<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" timeout="60000"/>
<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880"/>
<!-- 用户服务接口 -->
<dubbo:service interface="com.sky.service.UserService" ref="userService"/>
<bean id="userService" class="com.sky.service.UserServiceImpl"/>
</beans>
Provider的主启动类如下
@ImportResource("classpath:spring-provider.xml")
@MapperScan("com.sky.mapper")
@SpringBootApplication
public class UserProviderApplication {
public static void main(String[] args) {
SpringApplication.run(UserProviderApplication.class, args);
}
}
Yml配置文件如下:
server:
port: 8081
spring:
datasource:
username: root
password: root
url: jdbc:mysql://localhost:3306/kj03?useUnicode=true&characterEncoding=utf-8
driver-class-name: com.mysql.jdbc.Driver
mybatis:
mapper-locations: classpath:mapperxml/*.xml
config-location: classpath:mybtaisConfig.xml
把之前的mybatis的配置文件引入进来即可。
到这里我们的provider已经配置编写好了
此时,可以启动我们的provider,然后在dubbo-admin中进行查看该服务释放以及注册到了zookeeper中。
在consumer中其实就是写之前的controller的相关内容。在编写代码之前,需要在consumer的POM中引入公共的模块,同时还要引入dubbo和zookeeper相关的依赖。
在consumer项目下新建com.sky.controller.UserController, 并且在里面完成对应方法的编写和映射。
因为后面我们得服务器主要都是提供数据的,所以直接使用restController注解即可。
在consumer的核心配置文件中我们仅仅就是换了一下端口号,其他的暂时没有做变更。
# consumer的配置文件
server.port=9090
和provider类似的是,consumer也是需要一个dubbo的配置文件,需要在consumer项目下的resources文件夹下新建一个spring-consumer.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="user-consumer"/>
<dubbo:registry check="false" address="zookeeper://127.0.0.1:2181"/>
<dubbo:reference interface="com.sky.service.UserService" id="userService"/>
</beans>
Consumer的主启动类如下, 需要引入我们后加入的配置文件
@ImportResource("classpath:spring-consumer.xml")
@SpringBootApplication
public class UserConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(UserConsumerApplication.class, args);
}
}
注意:启动的时候是有顺序的
第一件事就是先启动我们的注册中心
出现下图则说明成功了,黑窗口不能关闭!!!!!切记:不能关闭
进入到dubbo-admin的源码目录,在target目录下有之前生成好的一个jar文件,
通过 java -jar jarName的方式可以启动dubbo-admin服务,然后访问localhost:7001即可实现登录查看我们的服务
服务的提供者就是我们之前写的provider,启动方式就是通过主启动的方式启动
注意:必须要先启动provider
启动后通过dubbo-admin可以在提供者的列表中查看到当前的服务
点击可以查看详情:
消费者的启动和提供者的启动方式是一样的,其实就是启动应用!注意端口号的修改,启动完成之后我们就可以看到有2个服务在启动了。
完成后,打开dubbo-admin
此时我们需要访问服务的消费者中提供的请求映射,有数据返回,说明我们的微服务架构搭建已经完成了。
到此,一个springboot + dubbo + mybatis 的微服务架构就已经搭建完成了,很简单
如要源码和资料的同学可以关注微信公众号:六点半编程, 回复资料即可获得。
公众号中有很多技术的选型,架构师的必备技能,以及一些设计模式的文章
扫码关注:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。