先晒一张架构图
微服务模块和api网关使用spring boot2 作为基础架构,微服务注册采用zookeeper
下面开始搭建:
第一步:创建一个父模块(不是必须的,可以不创建,这里为了方便管理)
微服务的每一个模块都是一个独立的程序,因此父模块并不是必须创建的,但是为了方便管理jar包,服务模块,还是创建一个空的父模块。(这里使用idea演示)
(1)file-》new -》project
(2)
(3)
(4)清理一下目录结构
第二步:创建api网关模块(消费者)
api网关在微服务中不是必须的,但是api网关是微服务中一个比较重要的组成部分。api网关统一为其他程序提供api接口,封闭内部微服务的复杂性,使用微服务的开发人员只需要知道api网关提供的接口就可以了,api网关可以统一的提供网络安全,跨域解决,权限认证等。
dubbo 不像 spring cloud一样有现成的网关模块 (Zuul),因此需要自己开发这个模块,这里api网关模块就作为微服务的消费者(正常情况下也是消费者),以后也行会重新做该模块,因为api网关是整个微服务集群的入口,需要承担很大的压力,因此api网关需要十分稳定,并且需要一定的抗压能力,api网关也最有可能成为性能的瓶颈,还好已经有了不少来源 api gateway 性能都很好,例如 :Kong,apiaxle等
(1)创建spring boot模块(需要springmvc 对外提供服务接口)
右键项目 new - 》 Module -》 (使用 spring 官网提供的脚手架创建spring boot项目即可)
(2)填写模块信息
(3)添加web依赖(为微服务集群提供Restful 接口 )
也可以添加一些方便restful的组件,这里先不添加了,需要以后再加
然后一直点到finish
(4)清理目录(只是为了整洁)
第三步:添加生产者模块
这里就以用户管理微服务模块为例
同第二步创建api网关一致,只是下面这一步什么都不需要选,接口由api网关提供(mybatis之类的,之后再加,这里只演示dubbo框架搭建流程,如果感觉需要在这里加上mybatis,自己去勾选,spring boot+mybatis 实现 见 https://blog.csdn.net/qq_26462567/article/details/83447895 )
第四步:创建api共有组件(不是必须但是为了接口调用方便,建议创建一个)
api组件负责提供对我服务的接口,每个微服务模块的接口声明都在 改组件中做声明,每个组件都引用该组件,尤其是网关,当调用组件时只需要直接使用该组件中声明的接口就可以了(面向接口),做到一次编程,代码复用。
同理,为了数据流转的方便,实体我们也可以声明一个公用的组件 ,实现每个微服务之间的统一的ORM(并不是建议每个微服务模块之间互相调用,每个微服务之间还是尽量少的互相依赖,api网关除外)。
(1)创建maven组件
右键项目 new - 》 Module -》
(2)填写组件信息
(3)完成创建
(4)创建接口包
(5)创建测试服务接口
代码如下:
package cn.com.kgo.common.api.service;
/**
* @author keepgoon
* @Description: TODO
* @date 2019/4/2916:59
*/
public interface TestService {
public String getServiceInfo();
}
第五步:微服务引入api共有组件
api网关模块,用户管理模块 都需要引用该模块(具体引入代码可能和自己声明的组件不同而有变化)
<dependency>
<groupId>cn.com.kgo.common.api</groupId>
<artifactId>common-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
第六步:引用dubbo 和 zookeeper 依赖
在api网关模块和用户管理模块中引用即可,api公用组件不需要引用
<!--分布式依赖 开始-->
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.11</version>
</dependency>
<!--分布式依赖 结束-->
dubbo-spring-boot-starter 在github上有中文文档说明 https://github.com/alibaba/dubbo-spring-boot-starter/blob/master/README_zh.md
首先,集成dubbo和spring boot 不只是这一种方式,不使用 dubbo-spring-boot-starter dubbo官网也提供了集成方案,但是使用模块要简单,反正都是阿里提供的。
第七步:zookeeper 安装使用(windows)
(1)下载地址:https://archive.apache.org/dist/zookeeper/
这篇文章写的时候最新版本是3.4.14 下载最新版本即可
(2)下载完解压目录如下
(3)配置zookeeper
在conf目录下 找到文件 zoo_sample.cfg ,修改为 zoo.cfg,就可以使用了(不需要修改什么),具体配置如下:
(4)启动zookeeper
bin 目录下有个zkServer.cmd文件启动即可(需要java环境,建议使用jdk1.8)
第八步:用户管理模块实现testService服务,并配置微服务为生产者
(1)实现testService并提供服务,代码如下:
@Component注解是spring的注解,该服务由spring来管理
@Service 注解是dubbo的注解,spring也有同名的注解,注意一下这里是dubbo的注解,告诉dubbo该服务对外提供服务
TestService接口在api通用组件中声明,该接口会在网关调用该服务时再次使用。
package cn.com.kgo.usermanage.service.impl;
import cn.com.kgo.common.api.service.TestService;
import com.alibaba.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;
/**
* @author keepgoon
* @Description: TODO
* @date 2019/4/2917:20
*/
@Component
@Service
public class TestServiceImpl implements TestService {
@Override
public String getServiceInfo() {
return "这是 用户权限管理服务 测试服务";
}
}
(2)配置dubbo 生产者
application.properties 可以使用yml,规则就不说了
spring.application.name=keepgoon-usermanage
spring.dubbo.server=true
spring.dubbo.registry=zookeeper://localhost:2181
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=20882
spring.dubbo.registry=zookeeper://localhost:2181 表示使用zookeeper,并不一定是zookeeper
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=20882 如果是单个生产者可以不用配置,name默认为 dubbo , 端口默认为20880
(3)声明dubbo配置生效
spring boot启动类中添加注解@EnableDubboConfiguration
package cn.com.kgo.usermanage;
import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableDubboConfiguration
public class UsermanageApplication {
public static void main(String[] args) {
SpringApplication.run(UsermanageApplication.class, args);
}
}
第九步:实现api网关消费者,并暴露服务
(1)同上 ,在 api网关的spring boot启动类中添加注解@EnableDubboConfiguration
(2) 配置为消费者
spring.application.name=keepgoon-gateway
spring.dubbo.registry=zookeeper://localhost:2181
server.port=8866
(3)使用服务并暴露接口
package cn.com.kgo.gateway.controller;
import cn.com.kgo.common.api.service.TestService;
import com.alibaba.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author keepgoon
* @Description: TODO
* @date 2019/4/2917:37
*/
@RestController
public class TestController {
@Reference
private TestService testService;
@RequestMapping("/")
public String getInfo(){
return testService.getServiceInfo();
}
}
最后
运行结果如下
坑 :
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.11</version>
</dependency>
这里使zookeeper 要放到spring boot start 后面,要不然会包 logback的错误
这里是一个更加完整的实例,声明了三个生产者,一个api网关消费者,两个模块 api 模块和实体模块
https://gitee.com/under_the_sky/keepgoonDubbo/releases
本次代码 : https://download.csdn.net/download/qq_26462567/11151862