详细演示user-service的搭建过程,user-consume的搭建过程类似,只说明有区别的部分。

这两个项目没有构成完整的微服务demo,完整的需要去看主文章。

1. 创建工程和user-service模块

1.1 创建空工程

1.2 在空工程里新建Module

一个Module就是一个项目,一个微服务。

选择Spring Initializr,JDK1.8及以上,Default URL(访问这个URL:https://start.spring.io也可以在页面上选择模块构建并下载工程)

填写Group和Artifact信息

选择模块

由于我们要提供接口,查询并返回数据,所以需要Web和SQL的相应模块。

点Next->Finish完成。

项目结构如图所示:

  • UserServiceApplication: 启动里面的main函数就能启动这个项目。
  • resources:里面放静态资源,static放的一般是图片,脚本和CSS;templates是前端静态化页面的默认存放位置(本例不涉及页面静态化)。
  • application.yml:SpringBoot项目的整体配置文件,可以配置包括JDBC、连接池等属性。这个文件默认后缀名是properties,可以修改为yml,yml的语法更简洁。
  • pom.xml:这是一个maven项目,里面引入了项目所需的各种依赖。

2. 配置文件

2.1 pom.xml

除了自动生成的部分,我还添加了三个依赖

  • javax.persistence-api:java持久层API,用于pojo类的@Table等注解,关联实体类和数据库表
  • lombok: 用于pojo类的@Data注解,用于自动生成get,set方法。
  • mapper-spring-boot-starter: 通用mapper,继承通用mapper后能直接使用其包含的查询方法查询,不必再写xml文件。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.5.RELEASE</version>
<relativePath/>
</parent>
<groupId>com.vplus.demo</groupId>
<artifactId>user-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>user-service</name>
<description>Demo project for Spring Boot</description> <properties>
<java.version>1.8</java.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--*******************自己添加的依赖开始*****************-->
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>javax.persistence-api</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.0.2</version>
</dependency>
<!--*******************自己添加的依赖结束*****************-->
</dependencies> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> </project>

2.2 application.yml

  • SpringBoot里面自带tomcat,配置端口为8081即可使用
  • 自带hikariCP数据源,直接配置即可。我的mysql版本为5.7,url属性需要加上useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC来解决时区和乱码问题。
  • mybatis只需要指明pojo类在哪里即可。
server:
port: 8081
spring:
datasource:
url: jdbc:mysql://localhost:3306/你的数据库名?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
username: 你的数据库用户名
password: 你的数据库用户密码
hikari:
maximum-pool-size: 20
minimum-idle: 10
mybatis:
type-aliases-package: com.vplus.demo.userservice.pojo

3. 代码

3.1 代码目录结构

3.2 UserController

@RestController注解相当于@Controller注解外加给所有方法加上@ResponseBody注解。表现为:每个方法返回的都是json字符串。

@RestController
@RequestMapping("user")
public class UserController {
@Autowired
private UserService userService; @GetMapping("/{id}")
public User queryById(@PathVariable("id") Long id) {
return this.userService.queryById(id);
}
}

3.3 UserService

为了简便,不再写service接口和Impl实现了,直接合成一个Service类。

@Service
public class UserService {
@Autowired
private UserMapper userMapper; public User queryById(Long id) {
return this.userMapper.selectByPrimaryKey(id);
}
}

3.4 UserMapper

继承通用Mapper,由于@Mapper注解的存在,和通用Mapper重名,因此通用Mapper写成全类名tk.mybatis.mapper.common.Mapper<User>

@Mapper
public interface UserMapper extends tk.mybatis.mapper.common.Mapper<User>{
}

3.5 启动

启动UserServiceApplication的main函数,访问http://localhost:8081/user/20即可查到ID为20的用户。

至此user-service模块搭建完成

4. 创建user-consume模块

搭建流程和创建user-service模块一致,需要注意一点:选择依赖时只选Web模块,不需要SQL模块。因为数据是从user-service提供的接口里面读的。

添加第二个模块后,Idea会提示你是否显示Run DashBoard,要选择显示。

4.1 配置文件

pom.xml

  • 我们使用RestTemplate请求接口,底层Http客户端使用Okhttp实现,所以添加其依赖。
  • pojo类需要@Data注解生成get/set方法,添加lombok依赖。
省略......
</dependencies>
省略.......
<!--添加OKhttp支持-->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.9.0</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
省略......

application.yml

配置项目的tomcat端口为8082

server:
port: 8082

4.2 代码

项目结构

UserConsumeApplication

注册RestTemplate

@SpringBootApplication
public class UserConsumeApplication {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate(new OkHttp3ClientHttpRequestFactory());
}
public static void main(String[] args) {
SpringApplication.run(UserConsumeApplication.class, args);
}
}

User

这个项目还需要User类来承载数据,但不需要关联数据表了,所以@Table注解就不用写了

@Data
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private String username;
private String phone;
}

ConsumerController

@RestController
@RequestMapping("consume")
public class ConsumerController {
@Autowired
private UserService userService;
@GetMapping
public List<User> consume(@RequestParam("ids") List<Long> ids) {
return this.userService.queryUserByIds(ids);
}
}

UserService

@Service
public class UserService {
@Autowired
private UserDao userDao;
public List<User> queryUserByIds(List<Long> ids){
List<User> users = new ArrayList<>();
for (Long id : ids) {
User user = this.userDao.queryUserById(id);
users.add(user);
}
return users;
}
}

UserDao

这里的Dao并不是“真正的Dao”,不是从数据库查询数据,而是使用RestTemplate访问远程的rest接口。

@Component
public class UserDao {
@Autowired
private RestTemplate restTemplate; public User queryUserById(Long id){
String url = "http://localhost:8081/user/" + id;
return this.restTemplate.getForObject(url, User.class);
}
}

4.3 启动运行

从Run DashBoard中依次启动两个项目。访问:http://localhost:8082/consume?ids=20,21即可查询id=20和21的两个用户的信息

5. 参考资料

  • 黑马培训的乐优商城笔记
  • spring官网

(子文章)Spring Boot搭建两个微服务模块的更多相关文章

  1. spring boot / cloud (十四) 微服务间远程服务调用的认证和鉴权的思考和设计,以及restFul风格的url匹配拦截方法

    spring boot / cloud (十四) 微服务间远程服务调用的认证和鉴权的思考和设计,以及restFul风格的url匹配拦截方法 前言 本篇接着<spring boot / cloud ...

  2. Spring boot学习1 构建微服务:Spring boot 入门篇

    Spring boot学习1 构建微服务:Spring boot 入门篇 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框 ...

  3. Spring Boot 和 Docker 实现微服务部署

    Spring boot 开发轻巧的微服务提供了便利,Docker 的发展又极大的方便了微服务的部署.这篇文章介绍一下如果借助 maven 来快速的生成微服务的镜像以及快速启动服务. 其实将 Sprin ...

  4. Spring Boot 是 Spring 的一套快速配置脚手架,可以基于Spring Boot 快速开发单个微服务

    Spring Boot 是 Spring 的一套快速配置脚手架,可以基于Spring Boot 快速开发单个微服务,Spring Cloud是一个基于Spring Boot实现的云应用开发工具:Spr ...

  5. 使用Ratpack与Spring Boot构建高性能JVM微服务

    在微服务天堂中Ratpack和Spring Boot是天造地设的一对.它们都是以开发者为中心的运行于JVM之上的web框架,侧重于生产率.效率以及轻量级部署.他们在服务程序的开发中带来了各自的好处.R ...

  6. 在Azure DevOps Server中运行基于Spring Boot和Consul的微服务项目单元测试

    1 概述 谈到微服务架构体系,绕不开服务发现这个功能.服务发现机制是简化微服务配置.实现容灾.水平扩缩容.提高运维效率的重要方式.在服务发现工具中,Consul在部署和使用方面与容器结合的天衣无缝,成 ...

  7. maven 聚合工程 用spring boot 搭建 spring cloud 微服务 模块式开发项目

    项目的简单介绍: 项目采用maven聚合工程 用spring boot 搭建 spring cloud的微服务 模块式开发 项目的截图: 搭建开始: 能上图 我少打字 1.首先搭建maven的聚合工程 ...

  8. 基于Spring Boot、Spring Cloud、Docker的微服务系统架构实践

    由于最近公司业务需要,需要搭建基于Spring Cloud的微服务系统.遍访各大搜索引擎,发现国内资料少之又少,也难怪,国内Dubbo正统治着天下.但是,一个技术总有它的瓶颈,Dubbo也有它捉襟见肘 ...

  9. 【spring cloud】子模块module -->导入一个新的spring boot项目作为spring cloud的一个子模块微服务,怎么做/或者 每次导入一个新的spring boot项目,IDEA不识别子module,启动类无法启动/右下角没有蓝色图标

    如题:导入一个新的spring boot项目作为spring cloud的一个子模块微服务,怎么做 或者说每次导入一个新的spring boot项目,IDEA不识别,启动类无法启动,怎么解决 下面分别 ...

随机推荐

  1. Linux统计即时网速

    Linux查看网络即时网速 sar -n DEV 1 1代表一秒统计并显示一次 在Linux下还有两个工具可以实时的显示流量信息 一个是iftop 另一个是nload.

  2. [fw]linux测试工程介绍(Linux Test Project)

    http://ltp.sourceforge.net/ Linux Test Project, 后台很硬,由SGI™ 发起, IBM维护,所以质量有保障. 里面介绍了很多工具,对于一般的基准测试应该是 ...

  3. 关于Myeclipse下的JVM启动异常的问题:Out Of Memery / Could not reserve enough space for object heap

    以下都是初步理解: 这主要是JVM内存配置的问题,网上有很多参考资料,但是我们不能死板硬套,必须根据自己工程的实际情况配置相关的参数. 1.按照jvm的设计规则,JVM内存分为堆(Heap)和非堆(N ...

  4. ECharts 图表导出

    Echarts图形是由Javascript亲自在前端网页上绘制的 1.用ECharts配置项手册中的toolbox.feature.saveAsImage toolbox: { show: true, ...

  5. C#面试 笔试题 四

    1.请你简单的说明数据库建立索引的优缺点 使用索引可以加快数据的查询速度,不过由于数据插入过程中会建索引,所以会降低数据的插入.更新速度,索引还会占磁盘空间. 2.什么是WEB服务控件?使用WEB服务 ...

  6. 录制rtsp音视频

    1.使用ffmpeg来录制rtsp视频 视频 ffmpeg -y -i rtsp://172.16.23.66:554/h264major -vcodec copy -f mp4 record.mp4 ...

  7. macos Item2 添加 Shell Integration (ftp传输)

    macos系统 的item2软件 的  Shell Integration (ftp传输)  功能强大,无需 安装其他ftp软件,也是为了保证 密码安全 在使用时报错如下(因为本地 ping不通): ...

  8. Envoy的线程模型[翻译]

    Envoy threading Model 关于envoy 代码的底层文档相当稀少.为了解决这个问题我计划编写一系列文档来描述各个子系统的工作.由于是第一篇, 请让我知道你希望其他主题覆盖哪些内容. ...

  9. Sybase 修改数据库默认排序

    我新建了一个sybase数据库,想用dump文件load,可是报数据库的排序不对,就去Centrol里面修改,但是还是报错,说是字符集不存在.办法如下: 打开命令行,进入到sybase的ASE-15_ ...

  10. vue之templete模板

    1.templete里要用data里的数据的话,不要加this. 2.按理说Js是写在<script></script>标签体内的.但是Vue的templete模板中对所有的数 ...