1:使用背景

传统单体架构:所有的服务都部署在一台服务器上,如图:

 

在互联网的发展过程中,在以前,我们只需要一个服务器,将程序全部打包好就可以,但是,随着流量的增大,常规的垂直应用架构已无法应对,所以,架构就发生了演变。

 

所有的功能都写在一个工程中,规模巨大,不好,更新维护麻烦,项目访问量大时,需要许多服务器,可能访问量大是某些模块的请求多。

同时对于项目的拓展也有阻力,当项目变更时,所有的服务器都必须要进行变更,矛盾更加的剧烈。

2:dubbo是什么

Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。

RPC是指远程调用,举例:2台服务器A,B,A服务器上的应用想调用B服务器上的方法,由于不再一个内存中,不能直接调用,需要通过网络来表达调用和传递调用的数据。

简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求,

并且本质上是个服务调用的东西,说白了就是个远程服务调用的分布式框架。

3:能解决什么问题

  1. 透明化的RPC远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。
  2. 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器
  3. 软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。
  4. 使用 Dubbo 可以将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,可用于提高业务复用灵活扩展,使前端应用能更快速的响应多变的市场需求。
  5. 分布式架构可以承受更大规模的并发流量。

4:dubbo的架构

dubbo架构图如下所示: - 原理图

 

节点角色说明:

Provider: 暴露服务的服务提供方。

Consumer: 调用远程服务的服务消费方。

Registry: 服务注册与发现的注册中心。

Monitor: 统计服务的调用次调和调用时间的监控中心。

Container: 服务运行容器。

调用关系说明:

0 服务容器负责启动,加载,运行服务提供者。

1 服务提供者在启动时,向注册中心注册自己提供的服务。

2 服务消费者在启动时,向注册中心订阅自己所需的服务。

3 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。

4 服务消费者,从提供者地址列表中,选一台提供者进行调用,如果调用失败,再选另一台调用。

5 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

5:具体使用流程

1:安装zookeeper

在另外一个文档中有详细的说明,

注意:zookeeper服务启动之后就不能停掉了,而且要在服务的提供者和消费者之前就启动好注册中心

2:管理控制台

在另外一个文档,dubbo-admin

3:准备项目

新建一个简单的maven项目进行管理:

在自己的workspace中新建一个项目,当前项目就是一个总的管理中心,在这个项目中不会写任何的代码,所有的代码都是写在provider中和consumer中。

所以一般情况下,这个项目只需要是一个简单的maven项目即可,我们也会将当前项目中的src目录进行删除。只会保留最基本的项目架构。

Provider是服务的提供者, mvc -- model

Consumer是消息的消费者 mvc - controller

注意:在启动provider和consumer之前,必须要启动注册中心,这样启动的服务才会在注册中心被注册和发现。

创建项目来进行管理:

 

编写父级项目

 

选择自己的mvn

 

信息核对

 

因为这个父项目主要是做管理的,不会有任何代码出现,所以将src直接删掉即可

 

4:创建公共模块

将一些提供者和消费都需要使用的内容我们可以存放在公共模块中,比如pojo相关内容和对外暴露的service接口,以及一些工具类的相关内容等。

这些信息在provider中需要,在consumer中同样是需要的,如果隐藏的话,那么在这些模块中都需要编写,比较麻烦,

所以直接将这些内容放在公共模块中,这样需要的话直接引入即可。

右击项目,新建模块(module)

 

因为module里存放的时pojo和service,因此我们只需要构建普通工程即可

 

 

 

 

 

5:创建provider

Provider 是服务的提供者,可以理解为mvc开发模式中的M, 就是从service以后的所有的内容都写在这个项目下。

模块直接使用springboot的模板创建,因为是一个提供者,所以需要将mybatis相关的内容和数据库相关的内容也一起勾上。

注意:虽然是provider模块,但是web相关的内容也还是要勾上的。

点击项目名,然后右击,新建一个模块(module)

 

 

 

 

6:创建consumer

和构建提供者provider一样的方式去构建调用者consumer,

在选择模板的时候,因为只需要和客户端的浏览器进行交互,我们只需要选择一个web即可。

因为我们的数据都是来源于provider,所以不需要连接数据库的相关内容。

 

 

 

构建结束后的项目结构如下

 

到目前为止,咱们就创建好了相关的模块的服务提供者和消费者,同时也抽取了公共的模块内容。接下来就是编写和配置了

8:编写公共模块

这里还是以我们熟悉的user为例,在公共模块下新建User类,包名为com.sky.pojo.

注意:pojo类必须要实现序列化接口

 

在common工程中的java文件夹下的com.sky.service包下构建接口UserService,内容如下

 

到这里咱们就完成了公共模块的一些内容的编写,pojo是共用的内容,service接口是对外暴露的服务,实现的细节需要隐藏起来,我们在provider中进行实现。

 

9:编写配置provider

1:修改provider的pom文件

在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>

2:provider代码实现:

在provider下新建一个service包和mapper包,service包中的UserServiceImpl需要实现公共模块的UserService接口,在mapper包下新建UserMapper接口

并且在resources下新建mapperxml文件夹,在该文件夹下新建UserMapper.xml

内容其实和以前是一样的。

 

 

 

3:配置provider

编写在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中。

10:编写配置consumer

1:修改POM文件和代码编写

在consumer中其实就是写之前的controller的相关内容。在编写代码之前,需要在consumer的POM中引入公共的模块,同时还要引入dubbo和zookeeper相关的依赖。

在consumer项目下新建com.sky.controller.UserController, 并且在里面完成对应方法的编写和映射。

因为后面我们得服务器主要都是提供数据的,所以直接使用restController注解即可。

 

2:核心配置文件配置

在consumer的核心配置文件中我们仅仅就是换了一下端口号,其他的暂时没有做变更。

# consumer的配置文件
  server.port=9090

 

3:配置consumer

和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);
    }

}

 

11:微服务的测试

1:启动zookeeper服务端

注意:启动的时候是有顺序的

第一件事就是先启动我们的注册中心

 

出现下图则说明成功了,黑窗口不能关闭!!!!!切记:不能关闭

 

2:启动dubbo-admin

进入到dubbo-admin的源码目录,在target目录下有之前生成好的一个jar文件,

通过 java -jar jarName的方式可以启动dubbo-admin服务,然后访问localhost:7001即可实现登录查看我们的服务

 

 

 

 

3:启动服务的提供者

服务的提供者就是我们之前写的provider,启动方式就是通过主启动的方式启动

注意:必须要先启动provider

 

启动后通过dubbo-admin可以在提供者的列表中查看到当前的服务

 

点击可以查看详情:

 

4:启动消费者consumer

消费者的启动和提供者的启动方式是一样的,其实就是启动应用!注意端口号的修改,启动完成之后我们就可以看到有2个服务在启动了。

 

完成后,打开dubbo-admin

 

 

5:打开浏览器获取postman进行测试

此时我们需要访问服务的消费者中提供的请求映射,有数据返回,说明我们的微服务架构搭建已经完成了。

 

到此,一个springboot + dubbo + mybatis 的微服务架构就已经搭建完成了,很简单

如要源码和资料的同学可以关注微信公众号:六点半编程, 回复资料即可获得。

公众号中有很多技术的选型,架构师的必备技能,以及一些设计模式的文章

扫码关注:

 

 

 

 

 

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐