关键词:
1,springcloud简介
springcloud是分布式微服务架构的一站式解决方案,是多种微服务架构落地技术的集合体,俗称微服务全家桶。实现的功能有服务注册与发现,服务调用,服务熔断,负载均衡,服务降级,服务消息队列,配置中心管理,服务网关,服务监控,全链路追踪,自动化部署。
现在我们常用的五大组件
- 服务注册与发现——Eureka
- 负载均衡:
-
- 客户端负载均衡——Ribbon
- 服务端负载均衡:——Feign
- 断路器——Hystrix
- 服务网关——Zuul
- 分布式配置——Spring Cloud Config
2,微服务的优缺点
优点
- 单一职责原则;
- 每个服务足够内聚,足够小,代码容易理解,这样能聚焦一个- 指定的业务功能或业务需求;
- 开发简单,开发效率高,一个服务可能就是专一的只干一件事;
- 微服务能够被小团队单独开发,这个团队只需2-5个开发人员组成;
- 微服务是松耦合的,是有功能意义的服务,无论是在开发阶段或部署阶段都是独立的;
- 微服务能使用不同的语言开发;
- 易于和第三方集成,微服务允许容易且灵活的方式集成自动部署,通过持续集成工具,如jenkins,Hudson,bamboo;
- 微服务易于被一个开发人员理解,修改和维护,这样小团队能够更关注自己的工作成果,无需通过合作才能体现价值;
- 微服务允许利用和融合最新技术;
- 微服务只是业务逻辑的代码,不会和HTML,CSS,或其他的界面混合;
- 每个微服务都有自己的存储能力,可以有自己的数据库,也可以有统一的数据库;
缺点
- 开发人员要处理分布式系统的复杂性;
- 多服务运维难度,随着服务的增加,运维的压力也在增大;
- 系统部署依赖问题;
- 服务间通信成本问题;
- 数据一致性问题;
- 系统集成测试问题;
- 性能和监控问题;
3,springboot与springcloud的区别
- SpringBoot专注于开苏方便的开发单个个体微服务;
- SpringCloud是关注全局的微服务协调整理治理框架,它将SpringBoot开发的一个个单体微服务,整合并管理起来,为各个微服务之间提供:配置管理、服务发现、断路器、路由、为代理、事件总栈、全局锁、决策竞选、分布式会话等等集成服务;
- SpringBoot可以离开SpringCloud独立使用,开发项目,但SpringCloud离不开SpringBoot,属于依赖关系;
- SpringBoot专注于快速、方便的开发单个个体微服务,SpringCloud关注全局的服务治理框架;
4,搭建父工程
首先创建父工程(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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.kuang</groupId>
<artifactId>springcloud</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>Hoxton.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--SpringBoot-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.2.5.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>
5,创建microservicecloud-api 工程
(封装的整体entity/接口/公共配置等)
导入依赖:
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
创建实体类:
//链式写法
@Accessors(chain = true)
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
/**
* Dept 实体类 orm 类表关系映射
*/
public class Dept implements Serializable
/**
* 主键
*/
private Long deptno;
private String dname;
/**
* 这个数据存在哪个数据库字段~微服务,一个服务对应一个数据库,同一个信息可能存在不同数据库
*/
private String db_source;
/*
* 链式写法:
* Dept dept = new Dept();
* dept.setDeptNo(11).setDname('sss').setDb_source('001');
*
* */
6,搭建服务提供者工程
服务提供者相当于服务端
创建创建springcloud-provider-dep-8001
然后导入依赖
<dependencies>
<!--我们需要拿到实体类,所以要配置api module-->
<dependency>
<groupId>com.kuang</groupId>
<artifactId>microservicecloud-api</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<!--junit-->
<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>
<!--test-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
</dependency>
<!--web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--jetty:尝试着用这个当应用服务器,与Tomcat没什么区别-->
<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>
然后编写一些配置类:
application.yml文件
server:
port: 8001
#mybatis配置
mybatis:
# 配置别名
type-aliases-package: com.yang.springcloud.pojo
# mybatis的配置文件
config-location: classpath:mybatis/mybatis-config.xml
# 编写sql语句的配置文件
mapper-locations: classpath:mybatis/mapper/*.xml
#spring配置
spring:
application:
# 服务的名称
name: springcloud-provider-dept
# 数据源的配置
datasource:
type: com.alibaba.druid.pool.DruidDataSourceC3P0Adapter
driver-class-name: org.gjt.mm.mysql.Driver
url: jdbc:mysql://localhost:3306/clouddb01?useUnicode=true&characterEncoding=UTF-8
username: root
password: ***
mybatis的配置文件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>
dao层:
@Mapper
@Repository
public interface DeptDao
/**
* 插入数据
* @param dept 部门对象
* @return 返回是否插入成功
*/
public boolean addDept(Dept dept);
/**
* 根据id查询部门信息
* @param id 部门id
* @return 返回部门对象
*/
public Dept queryById(Long id);
/**
* 查询所有的部门信息
* @return 返回部门信息组成的列表
*/
public List<Dept> queryAll();
mapper.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.kuang.springcloud.dao.DeptDao">
<insert id="addDept" parameterType="com.kuang.springcloud.pojo.Dept">
insert into dept (dname,db_source)
values (#dname,DATABASE());
</insert>
<select id="queryById" resultType="com.kuang.springcloud.pojo.Dept">
select *
from dept
where deptno = #deptno;
</select>
<select id="queryAll" resultType="com.kuang.springcloud.pojo.Dept">
select * from dept;
</select>
</mapper>
service层:
public interface DeptService
/**
* 插入数据
* @param dept 部门对象
* @return 返回是否插入成功
*/
public boolean addDept(Dept dept);
/**
* 根据id查询部门信息
* @param id 部门id
* @return 返回部门对象
*/
public Dept queryById(Long id);
/**
* 查询所有的部门信息
* @return 返回部门信息组成的列表
*/
public List<Dept> queryAll();
@Service
public class DeptServiceImpl implements DeptService
@Autowired
private DeptDao deptDao;
@Override
public boolean addDept(Dept dept)
return deptDao.addDept(dept);
@Override
public Dept queryById(Long id)
return deptDao.queryById(id);
@Override
public List<Dept> queryAll()
return deptDao.queryAll();
controller层:
//提供Restful服务
@RestController
public class DeptController
@Autowired
private DeptService deptService;
@PostMapping("/dept/add")
public boolean addDept( Dept dept)
return deptService.addDept(dept);
@GetMapping("/dept/get/id")
public Dept queryById(@PathVariable("id") Long id)
return deptService.queryById(id);
@GetMapping("/dept/list")
public List<Dept> queryAll()
return deptService.queryAll();
编写主启动类:
@SpringBootApplication
public class DeptProvider_8001
public static void main(String[] args)
SpringApplication.run(DeptProvider_8001.class,args);
然后启动主启动类进行测试:访问http://localhost:8001/dept/list
出现下面的示例表示服务提供者创建成功
7,搭建服务消费者工程
创建springcloud-consumer-dept-80
导入依赖:
<dependencies>
<dependency>
<groupId>com.kuang</groupId>
<artifactId>microservicecloud-api</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
编写yaml文件
server:
port: 80
创建消费者的bean
@Configuration
public class ConfigBean
@Bean
public RestTemplate getRestTemplate()
return new RestTemplate(springcloud-springcloud根/父项目,开发准备(代码片段)
一、SpringCloud开发项目工程说明在后续的SpringCloud工程项目开发,以及博文中,都要注意此文说明!1、SpringCloud本身并不是一个拿来即可用的框架,它是一套微服务规范,共有两代实现。(1)SpringCloudNet... 查看详情
springcloud-springcloud之stream构建消息驱动微服务框架;springcloudalibaba集成rocketmq(二十四)(代码片段)
阅读本文前可先参考SpringCloud-SpringCloud之Stream构建消息驱动微服务框架;RabbitMQ(十九)_MinggeQingchun的博客-CSDN博客_springcloudstream一、SpringCloudStream在微服务的开发过程中,会经常用到消息中间件,通过消息中间... 查看详情
springcloud-springcloud之config分布式配置;config注册至eureka;集成security安全认证(十七)(代码片段)
阅读本文前可先参考SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客https://blog.csdn.net/MinggeQingchun/article/details/125337347https://blog.csdn.net/MinggeQingchun/arti 查看详情
springcloud-springcloud之config分布式配置;加解密;配置信息局部刷新;springcloudbus+rabbitmq全局刷新(十六)(代码片段)
阅读本文前可先参考SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客https://blog.csdn.net/MinggeQingchun/article/details/125337347一、加解密在Git仓库中明文存储配置信息值,对于某些敏感... 查看详情
springcloud-springcloud之sleuth分布式链路跟踪;zipkin埋点数据;elasticsearch数据持久化(十八)(代码片段)
阅读本文前可先参考SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客一、SpringCloudSleuth微服务有几种监控方式,如SpringBootActuator监控微服务,SpringBootAdmin监控微服务,Hy... 查看详情
springcloud-springcloud之security服务安全机制(二十)(代码片段)
阅读本文前可先参考SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客SpringSecurity微服务的Rest服务都是基于http请求的,因此很有可能暴露在公网上,任何人都可能调用访问... 查看详情
springcloud-springcloud之gateway网关(十三)
阅读本文前可先参考SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客一、API网关引自百度百科API网关,软件术语,两个相互独立的局域网之间通过路由器进行通信,中... 查看详情
springcloud-springcloud之zuul和gateway网关(十四)(代码片段)
SpringCloudGateway是SpringCloud的一个子项目。而zuul则是Netflix公司的项目,只是Spring将zuul集成在SpringCloud中使用而已。因为zuul2.0连续跳票和zuul1的性能表现不是很理想,所以催生了spring团队开发了Gateway项目ZuulZuul是netflix公司的... 查看详情
springcloud-springcloud之config分布式配置;server,client配置(十五)(代码片段)
阅读本文前可先参考SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客在分布式微服务系统中,几乎所有服务的运行都离不开配置文件的支持,这些配置文件通常由各个服务... 查看详情
springcloud-springcloud之apolloconfig携程阿波罗配置中心(二十一)(代码片段)
由于SpringCloud自带的Config需要配合Bus使用,且不能实时刷新,因此市面上出现了很多开元的配置中心市面上开源的配置中心Apollo(阿波罗):携程框架部门研发的分布式配置中心,能够集中化管理应用不同... 查看详情
ha简介以及hbase简介
音频处理channelvocoder算法简介
系列文章目录DelayLine简介及其C/C++实现LFO低频振荡器简介及其C/C++实现【音效处理】Delay/Echo算法简介【音效处理】Vibrato算法简介【音效处理】Reverb混响算法简介【音效处理】Compressor压缩器算法简介【音频处理】FastCon... 查看详情
springcloud-springcloudnetflix之ribbon(代码片段)
阅读本文前可先参考 SpringCloud-SpringCloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客SpringCloudRibbon是一套基于NetflixRibbon实现的客户端负载均衡和服务调用工具Ribbon是Netflix公司发布的开源组件,其主要功... 查看详情
音频处理loudnessnormalization响度均衡算法简介(代码片段)
系列文章目录DelayLine简介及其C/C++实现LFO低频振荡器简介及其C/C++实现【音效处理】Delay/Echo算法简介【音效处理】Vibrato算法简介【音效处理】Reverb混响算法简介【音效处理】Compressor压缩器算法简介【音频处理】FastCon... 查看详情
概念简介javascript简介
【概念简介】Javascript简介Javascript是世界上最流行的脚本编程语言,主要用于Web开发,也可用于服务器、PC、笔记本电脑、平板电脑和智能手机等设备。Javascript是一种轻量级的编程语言,可插入HTML页面,由浏览器解释并执行。Jav... 查看详情
2html简介
HTML简介 查看详情
springcloud-springcloudalibaba之gateway集成sentinel(代码片段)
阅读本文前可先参考SpringCloud-SpringCloud之Gateway网关(十三)_MinggeQingchun的博客-CSDN博客_spring.cloud.gateway.routes[0]SpringCloud-SpringCloudAlibaba之Sentinel规则持久化(十)_MinggeQingchun的博客-CSDN 查看详情
androidrenderscriptrenderscript简介①(gpu简介|gpu系统架构)
文章目录一、GPU简介二、GPU系统架构1、传统GPU系统架构2、移动设备GPU系统架构使用RenderScript编写Android平台运行的高性能计算应用程序;RenderScript官方文档:https://developer.android.google.cn/guide/topics/renderscript/compute一、GPU简介图形处理... 查看详情