java框架之SpringCloud(2)-Rest微服务案例
在上一章节已经对微服务与 SpringCloud 做了介绍,为方便后面学习,下面以 Dept 部门模块为例做一个微服务通用 Demo —— Consumer 消费者(Client) 通过 REST 调用 Provider 提供者(Server)提供的服务,后续学习在该 Demo 基础上集成新功能。
环境
IDE:IDEA
SpringBoot 版本:1.5.20.RELEASE
SpringCloud 版本:Dalston.RELEASE
构建工具:Maven
开工
父工程构建
新建工程,打包方式为 pom ,工程名为 "microservicecloud" 依赖如下:
<?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><groupId>zze.springcloud</groupId><artifactId>microservicecloud</artifactId><version>1.0-SNAPSHOT</version><packaging>pom</packaging><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><junit.version>4.12</junit.version><log4j.version>1.2.17</log4j.version><lombok.version>1.16.18</lombok.version></properties><dependencyManagement><dependencies><!--Spring Cloud--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Dalston.RELEASE</version><type>pom</type><scope>import</scope></dependency><!--Spring Boot--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>1.5.20.RELEASE</version><type>pom</type><scope>import</scope></dependency><!--Mysql Connector--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency><!--DataSource--><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.0.31</version></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.3.0</version></dependency><!--log--><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-core</artifactId><version>1.2.3</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>${log4j.version}</version></dependency><!--test--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>${junit.version}</version></dependency></dependencies></dependencyManagement> </project>
pom.xml
下面新建的子工程的父工程都为 microservicecloud ,打包方式都为 jar。
公共子模块
新建名为 "microservicecloud-api" 的子工程,依赖如下:
<?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"><parent><artifactId>microservicecloud</artifactId><groupId>zze.springcloud</groupId><version>1.0-SNAPSHOT</version><relativePath>../microservicecloud/pom.xml</relativePath></parent><modelVersion>4.0.0</modelVersion><description>封装整体的 entity 、接口、公共配置等</description><artifactId>microservicecloud-api</artifactId><dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies> </project>
pom.xml
新建部门 Entity:
package zze.springcloud.entities;import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors;import java.io.Serializable;@AllArgsConstructor @NoArgsConstructor @Data @Accessors(chain = true) public class Dept implements Serializable {private Long deptNo; // 主键private String deptName; // 部门名称private String dbSource; // 来自哪个数据库,因为微服务架构中一个服务可以对应一个数据库,信息可被存储到不同数据库 }
zze.springcloud.entities.Dept
微服务Provider
新建名为 "microservicecloud-provider-dept-8001" 的子工程作为微服务提供者,依赖如下:
<?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"><parent><artifactId>microservicecloud</artifactId><groupId>zze.springcloud</groupId><version>1.0-SNAPSHOT</version><relativePath>../microservicecloud/pom.xml</relativePath></parent><modelVersion>4.0.0</modelVersion><description>部门微服务提供者</description><artifactId>microservicecloud-provider-dept-8001</artifactId><dependencies><dependency><groupId>zze.springcloud</groupId> <!--引入自定义的 api 通用包,可以使用 Dept 部门 Entity--><artifactId>microservicecloud-api</artifactId><version>${project.version}</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jetty</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><!--修改后立即生效,热部署--><dependency><groupId>org.springframework</groupId><artifactId>springloaded</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId></dependency></dependencies> </project>
pom.xml
初始化数据库表结构及数据:
DROP DATABASE IF EXISTS springcloud_8001; CREATE DATABASE springcloud_8001 CHARACTER SET UTF8; USE springcloud_8001;CREATE TABLE dept (dept_no BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT,dept_name VARCHAR(60),db_source VARCHAR(60) );INSERT INTO dept(dept_name, db_source) VALUES ('开发部', DATABASE()); INSERT INTO dept(dept_name, db_source) VALUES ('人事部', DATABASE()); INSERT INTO dept(dept_name, db_source) VALUES ('财务部', DATABASE()); INSERT INTO dept(dept_name, db_source) VALUES ('市场部', DATABASE()); INSERT INTO dept(dept_name, db_source) VALUES ('运维部', DATABASE());SELECT * FROM dept;
dept.sql
配置数据源及 mybatis 相关,指定服务端口为 8001:
server:port: 8001mybatis:config-location: classpath:mybatis/mybatis.cfg.xml # mybatis 配置文件路径type-aliases-package: zze.springcloud.entities # 所有 Entity 别名类所在包mapper-locations:- classpath:mybatis/mapper/**/*.xml # mapper 映射文件 spring:application:name: microservicecloud-dept # 当前微服务名称 datasource:type: com.alibaba.druid.pool.DruidDataSource # 数据源操作类型driver-class-name: org.gjt.mm.mysql.Driver # mysql 驱动包url: jdbc:mysql:///springcloud_8001 # 数据库连接 root username: rootpassword: rootdbcp2:min-idle: 5 # 数据库连接池的最小维持连接数initial-size: 5 # 初始化连接数max-total: 5 # 最大连接数max-wait-millis: 200 # 等待连接获取的最大超时时间
application.yml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration><settings><setting name="cacheEnabled" value="true"/> <!--二级缓存开启--><!--启用驼峰命名,表字段 user_name 可映射到 userName --><setting name="mapUnderscoreToCamelCase" value="true"/></settings> </configuration>
mybatis/mybatis.cfg.xml
编写部门 Dao:
package zze.springcloud.dao;import org.apache.ibatis.annotations.Mapper; import zze.springcloud.entities.Dept;import java.util.List;@Mapper public interface DeptDao {public boolean addDept(Dept dept);public Dept findById(Long id);public List<Dept> findAll(); }
zze.springcloud.dao.DeptDao
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="zze.springcloud.dao.DeptDao"><select id="findById" resultType="Dept" parameterType="Long">select dept_no,dept_name,db_source from dept where dept_no=#{deptNo};</select><select id="findAll" resultType="Dept">select dept_no,dept_name,db_source from dept;</select><select id="addDept" parameterType="Dept">insert into dept(dept_name,db_source) values(#{deptName},DATABASE());</select> </mapper>
mybatis/mapper/DeptMapper.xml
编写部门 Service:
package zze.springcloud.service;import zze.springcloud.entities.Dept;import java.util.List;public interface DeptService {public boolean add(Dept dept);public Dept get(Long id);public List<Dept> list(); }
zze.springcloud.service.DeptService
package zze.springcloud.service.impl;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import zze.springcloud.dao.DeptDao; import zze.springcloud.entities.Dept; import zze.springcloud.service.DeptService;import java.util.List; @Service public class DeptServiceImpl implements DeptService {@Autowiredprivate DeptDao deptDao;@Overridepublic boolean add(Dept dept) {return deptDao.addDept(dept);}@Overridepublic Dept get(Long id) {return deptDao.findById(id);}@Overridepublic List<Dept> list() {return deptDao.findAll();} }
zze.springcloud.service.impl.DeptServiceImpl
编写部门 Controller:
package zze.springcloud.controller;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import zze.springcloud.entities.Dept; import zze.springcloud.service.DeptService;import java.util.List;@RestController @RequestMapping("/dept") public class DeptController {@Autowiredprivate DeptService deptService;@PostMapping("/add")public boolean add(@RequestBody Dept dept) {return deptService.add(dept);}@GetMapping("/get/{id}")public Dept get(@PathVariable Long id) {return deptService.get(id);}@GetMapping("/list")public List<Dept> list() {return deptService.list();} }
zze.springcloud.controller.DeptController
编写主启动类:
package zze.springcloud;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication public class Application_8001 {public static void main(String[] args) {SpringApplication.run(Application_8001.class, args);} }
zze.springcloud.Application_8001
测试:
运行主启动类,访问 http://localhost:8001/dept/list:
test
微服务Consumer
新建名为 "microservicecloud-consumer-dept-80" 的子工程作为微服务提供者,依赖如下:
<?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"><parent><artifactId>microservicecloud</artifactId><groupId>zze.springcloud</groupId><version>1.0-SNAPSHOT</version><relativePath>../microservicecloud/pom.xml</relativePath></parent><modelVersion>4.0.0</modelVersion><description>部门微服务消费者</description><artifactId>microservicecloud-consumer-dept-80</artifactId><dependencies><dependency><groupId>zze.springcloud</groupId><artifactId>microservicecloud-api</artifactId><version>${project.version}</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--修改后立即生效,热部署--><dependency><groupId>org.springframework</groupId><artifactId>springloaded</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId></dependency></dependencies></project>
pom.xml
指定服务端口为 80:
server:port: 80
application.yml
新建配置类,注册 RestTemplate bean:
package zze.springcloud.cfgbeans;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate;@Configuration public class ConfigBean {@Beanpublic RestTemplate restTemplate() {return new RestTemplate();} }
zze.springcloud.cfgbeans.ConfigBean
新建 Controller,通过 RestTemplate bean 使用 Provider 提供的服务:
package zze.springcloud.controller;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.client.RestTemplate; import zze.springcloud.entities.Dept;import java.util.List;@RestController @RequestMapping("/consumer/dept") public class DeptController {// 微服务 Provider 的服务地址private final static String REST_URL_PREFIX = "http://127.0.0.1:8001";@Autowiredprivate RestTemplate restTemplate;@PostMapping("/add")public boolean add(@RequestBody Dept dept) {return restTemplate.postForObject(REST_URL_PREFIX + "/dept/add", dept,Boolean.class);}@GetMapping("/get/{id}")public Dept get(@PathVariable Long id){return restTemplate.getForObject(REST_URL_PREFIX + "/dept/get/" + id, Dept.class);}@GetMapping("/list")public List<Dept> list(){return restTemplate.getForObject(REST_URL_PREFIX + "/dept/list", List.class);} }
zze.springcloud.controller.DeptController
编写主启动类:
package zze.springcloud;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication public class Application_80 {public static void main(String[] args) {SpringApplication.run(Application_80.class, args);} }
zze.springcloud.Application_80
测试:
1、先启动部门微服务提供者即 microservicecloud-provider-dept-8001 工程。 2、再启动部门微服务消费者即 microservicecloud-consumer-dept-80 工程,访问 http://localhost/consumer/dept/list:
test
转载于:https://www.cnblogs.com/zze46/p/10662774.html
java框架之SpringCloud(2)-Rest微服务案例相关推荐
- 【学习日记2023.6.9】之 SpringCloud入门(认识微服务_服务拆分和远程调用RestTemplate_Eureka注册中心_Ribbon负载均衡_Nacos注册中心)
文章目录 SpringCloud 1. 认识微服务 1.1 单体架构 1.2 分布式架构 1.3 微服务 1.4 SpringCloud 1.5 总结 2. 服务拆分和远程调用 2.1 服务拆分原则 ...
- 从 Java 9 开始,Java 就华丽的转身为微服务了…
继 2014 年 3 月 Java 8 发布之后,时隔 4 年,2018 年 9 月,Java 11 如期发布,其间间隔了 Java 9 和 Java 10 两个非LTS(Long Term Supp ...
- 联发科heli p90_“如果您是Java开发人员并且正在编写微服务,那么Helidon是一个不错的选择”
联发科heli p90 " Helidon仅设计用于微服务" 尽管Oracle最近开放了 Helidon(一组Java库)的开源资源 ,但是该项目本身并不新鲜,正如Helidon项 ...
- JAVA计算机毕业设计鲜花订购网微服务Mybatis+系统+数据库+调试部署
JAVA计算机毕业设计鲜花订购网微服务Mybatis+系统+数据库+调试部署 JAVA计算机毕业设计鲜花订购网微服务Mybatis+系统+数据库+调试部署 本源码技术栈: 项目架构:B/S架构 开发语 ...
- 好未来晓黑板go-zero微服务框架: 你不需要懂微服务,懂业务就行
go-zero 0. go-zero介绍 go-zero是一个集成了各种工程实践的web和rpc框架.通过弹性设计保障了大并发服务端的稳定性,经受了充分的实战检验. go-zero 包含极简的 API ...
- SpringCloud(若依微服务版)读取Nacos中的配置以及多个服务共享Nacos配置的使用
场景 若依微服务版手把手教你本地搭建环境并运行前后端项目: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/109363303 在上 ...
- redis 什么是冷数据_阿里Java三面凉凉:微服务,Redis,JVM一个都搞不懂
前言: 金九银十刚刚过去了,不知道很多小伙伴都拿到自己心仪的offer没有,我这边也收到了一个粉丝投来的消息,说看到阿里的面试真题之后人都是懵的,发现自己一窍不通,下面给大家分享我这个粉丝的经历,以及 ...
- springcloud Hystrix Dashboard微服务监控
springcloud Hystrix Dashboard微服务监控简介 Hystrix监控 除了隔离依赖服务的调用以外,Hystrix还提供了近实时的监控,Hystrix会实时.累加地记录所有关于 ...
- 从零开始学习微服务 -微服务基本概述、微服务案例
1. SpringCloud概述 1.1 互联网应用架构 1.1.1 单体应用架构 在诞⽣之初,项目的⽤户量.数据量规模都⽐较⼩,项目所有的功能模块都放在一个工程中编码. 编译.打包并且部署在一个To ...
最新文章
- 集成测试_渐增与非渐增模式优缺点
- 网络分层模型OSI和TCP/IP四层模型
- kerberos的故事2
- css选择指定class的元素
- Arcgis Javascript那些事儿(十二)——geometry service几何服务
- Oracle密码过期怎么办
- 2021上半年软考数据库系统工程师真题完整版
- 牛顿插值法在Matlab上的实现
- 单反相机参数之ISO/焦距篇
- Vue组件开发——异步组件
- 谈谈对计算机网络的了解,对计算机网络的认识和了解
- greenDAO简单使用经验
- 信息系统项目管理师思维导图
- zk kafka常识
- php pcntl_alarm,pcntl_alarm定时闹钟信号详解
- java第一部分学习笔记
- 微信旧岛小程序章节目录
- 初学Linux RHEL时遇到的系列问题和解决方案
- 问题 Q:巧克力与小花梨
- 此起彼伏 竞相盛放?!!
热门文章
- larvel nginx 配置
- 深度拷贝时,类中的非简单类型字段
- Fix Backup Database is terminating abnormally When performing a Farm Backup
- 11.find 查找并复制文件
- ZeroMq的研究和使用
- arm-arago-linux-gnueabi 下载,arm-arago-linux-gnueabi问题
- c语言node类型_高阶宏的妙用技法,C语言宏你所不知道的聪明技巧
- 计算机组成与结构r形式,计算机组成复习(自己整理的)
- 计算机科学与技术 军校,清华大学计算机科学与技术系
- PostgreSQL 12系统表(10)pg_locks