SpringCloud 练习笔记.1 Rest环境搭建Provider
参考【【狂神说Java】SpringCloud最新教程IDEA版】 https://www.bilibili.com/video/BV1jJ411S7xr?p=12&share_source=copy_web&vd_source=440449145e930227ff33dc2fd89e1495
笔记参考https://www.kuangstudy.com/bbs/1374942542566551554#header5
一个基于SpringCloud的练习笔记,个人学习记录
什么是微服务?
微服务是一种架构思想,将单一的应用程序划分为一组小的服务,每个服务运行在自己独立的进程中,服务之间使用轻量级的通信相互协调,独立部署到生产环境,同时根据不同的服务,分别负责不同的业务处理,使用合适有效的开发语言编写服务,使用不同的方式存储数据。
技术上也就是说,将原来的一体式架构项目,所有业务功能都在一个系统服务里处理的,根据业务拆分为多个独立的微小的服务,每个服务只做一件事,来进行解耦。
微服务
关注的是一个点,具体解决某个问题或处理什么业务的服务应用程序;
使用springboot开发的一个小模块,每个模块负责一件事一个业务处理,强调的是个体所完成的具体功能
微服务架构
是一种架构模式,将原来的一体式架构项目,所有业务功能都在一个系统服务里处理的,根据业务拆分为多个独立的微小的服务,每个服务只做一件事,来进行解耦,这样的一种架构的设计模式;
微服务的优缺点
优点
- 单一职责原则,一个模块只负责一个业务的处理,解耦合
- 服务足够小,代码容易理解,全部关注点在指定的需求功能上
- 能适应不同的开发语言,易于集成其他第三方技术依赖
- 每个微服务有自己独立的存储数据库,也可以使用统一的数据库
缺点:
- 系统的复杂性提高
- 服务间网络的通信问题
- 数据的一致性问题
- 性能和监控问题
微服务技术栈
微服务技术条目 | 落地技术 |
---|---|
服务开发 | SpringBoot、Spring、SpringMVC等 |
服务配置与管理 | Netfix公司的Archaius、阿里的Diamond等 |
服务注册与发现 | Eureka、Consul、Zookeeper等 |
服务调用 | Rest、PRC、gRPC |
服务熔断器 | Hystrix、Envoy等 |
负载均衡 | Ribbon、Nginx等 |
服务接口调用(客户端调用服务的简化工具) | Fegin等 |
消息队列 | Kafka、RabbitMQ、ActiveMQ等 |
服务配置中心管理 | SpringCloudConfig、Chef等 |
服务路由(API网关) | Zuul等 |
服务监控 | Zabbix、Nagios、Metrics、Specatator等 |
全链路追踪 | Zipkin、Brave、Dapper等 |
数据流操作开发包 | SpringCloud Stream(封装与Redis,Rabbit,Kafka等发送接收消息) |
时间消息总栈 | SpringCloud Bus |
服务部署 | Docker、OpenStack、Kubernetes等 |
SpringCloud概述
Springboot和SpringCloud关系
- springboot是专注于单体的个体微服务
- SpringCloud是关注整个微服务协调治理的框架,将由springboot开发的一个个单体的微服务,进行整合管理,为服务之间提供:配置管理,服务发现,断路器,路由等集成服务
- SpringBoot是可以离开SpringCloud单独开发的,但是SpringCloud不能离开SpringBoot
SpringCloud五大组件
-
服务注册与发现–Eureka
-
负载均衡
–客户端负载均衡–Netflix Ribbon
–服务端负载均衡–Fegin(其实也是依赖Ribbon,将调用方式RestTemplete改为Service接口)
-
断路器–Hystrix
-
服务网关–Zuul
-
服务配置–Spring Cloud Config
使用RestTemplate便捷的访问远程HTTP服务的方式,简单的Restful服务模板
Rest环境搭建Provider
1.新建一个maven的父工程springcloud-ung ,将src删掉只留下pom文件管理
<?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>com.ung</groupId>
<artifactId>springcloud-ung</artifactId>
<version>1.0-SNAPSHOT</version>
<!--打包方式 pom-->
<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>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>0.2.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--springCloud的依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--SpringBoot-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.4.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--数据库-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<!--SpringBoot 启动器-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<!--日志测试~-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
2.新建一个api资源的模块 springcloud-api
注意,要将模块添加到springcloud-ung工程,并将springcloud-ung作为父工程
maven依赖
<?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>springcloud-ung</artifactId>
<groupId>com.ung</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>springcloud-api</artifactId>
<!--当前的model需要的依赖,如果父工程有了,那就不用指定版本了-->
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
</project>
创建数据库表
db01 字符集 utf8 排序规则utf8_general_ci 数据库 和 dept 表
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for dept
-- ----------------------------
DROP TABLE IF EXISTS `dept`;
CREATE TABLE `dept` (
`deptno` bigint(11) NOT NULL AUTO_INCREMENT,
`dname` varchar(60) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`db_source` varchar(60) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`deptno`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of dept
-- ----------------------------
INSERT INTO `dept` VALUES (1, '开发部', 'db01');
INSERT INTO `dept` VALUES (2, '财务部', 'db01');
INSERT INTO `dept` VALUES (3, '市场部', 'db01');
INSERT INTO `dept` VALUES (4, '运维部', 'db01');
INSERT INTO `dept` VALUES (5, '人事部', 'db01');
INSERT INTO `dept` VALUES (6, '维修部', 'db01');
SET FOREIGN_KEY_CHECKS = 1;
3.在api模块里添加实体类Dept
package com.ung.springcloud.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* @Author ung
* @Description: 实体类
*/
@Data
@NoArgsConstructor
@Accessors(chain = true)
@AllArgsConstructor
public class Dept implements Serializable {
private Long deptno;
private String dname;
private String dbSource;
public Dept(String dname) {
this.dname = dname;
}
}
新建springcloud-provider-dept-8001 模块,添加到父工程里
maven依赖
<?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>springcloud-ung</artifactId>
<groupId>com.ung</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>springcloud-provider-dept-8001</artifactId>
<dependencies>
<!--需要自己的api 模块-->
<dependency>
<groupId>com.ung</groupId>
<artifactId>springcloud-api</artifactId>
<version>1.0-SNAPSHOT</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>ch.qos.logback</groupId>
<artifactId>logback-core</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-test</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-jetty</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
</project>
配置文件
application.yml
server:
port: 8001
mybatis:
type-aliases-package: com.ung.springcloud.pojo
# config-location: classpath:mybatis/mybatis-config.xml
mapper-locations: classpath:mybatis/mapper/*.xml
# 开启驼峰命名
configuration:
map-underscore-to-camel-case: true
spring:
application:
name: springcloud-provider-dept-8001
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/db01?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
username: root
password: root
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--二级缓存-->
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
</configuration>
DeptMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ung.springcloud.dao.DeptDao">
<insert id="addDept" parameterType="com.ung.springcloud.pojo.Dept">
insert into dept(dname,db_source)
values (#{dname},DATABASE())
</insert>
<select id="queryById" resultType="com.ung.springcloud.pojo.Dept">
select * from dept
where deptno = #{id}
</select>
<select id="queryAll" resultType="com.ung.springcloud.pojo.Dept">
select * from dept
</select>
</mapper>
DeptService
package com.ung.springcloud.service;
import com.ung.springcloud.pojo.Dept;
import java.util.List;
/**
* @Author ung
* @Description:
*/
public interface DeptService {
boolean addDept(Dept dept);
Dept queryById(Long id);
public List<Dept> queryAll();
}
DeptDao
package com.ung.springcloud.dao;
import com.ung.springcloud.pojo.Dept;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* @Author ung
* @Description:
*/
@Mapper
@Repository
public interface DeptDao {
boolean addDept(Dept dept);
Dept queryById(Long id);
public List<Dept> queryAll();
}
DeptController
package com.ung.springcloud.controller;
import com.ung.springcloud.pojo.Dept;
import com.ung.springcloud.service.DeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* @Author ung
* @Description:
*/
@RestController
public class DeptController {
private DeptService deptService;
@Autowired
public DeptController(DeptService deptService) {
this.deptService = deptService;
}
@PostMapping("/dept/addDept")
public boolean addDept(@RequestBody Dept dept) {
return deptService.addDept(dept);
}
@GetMapping("/dept/queryById/{id}")
public Dept queryById(@PathVariable Long id) {
return deptService.queryById(id);
}
@GetMapping("/dept/list")
public List<Dept> list() {
return deptService.queryAll();
}
}
DeptProvider_8001 启动类
package com.ung.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @Author ung
* @Description:
*/
@SpringBootApplication
public class DeptProvider_8001 {
public static void main(String[] args) {
SpringApplication.run(DeptProvider_8001.class,args);
}
}
启动启动类,访问链接 http://localhost:8001/dept/list ,可以看到有正确响应就是成功了