springcloud
简介
Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有重复制造轮子,它只是将各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包
Spring Cloud组成
Spring Cloud的子项目,大致可分成两类,一类是对现有成熟框架”[Spring Boot](https://baike.baidu.com/item/Spring Boot/20249767)化”的封装和抽象,也是数量最多的项目;第二类是开发了一部分分布式系统的基础设施的实现,如Spring Cloud Stream扮演的就是kafka, ActiveMQ这样的角色。对于我们想快速实践微服务的开发者来说,第一类子项目就已经足够使用,如:
-
Spring Cloud Netflix 是对Netflix开发的一套分布式服务框架的封装,包括服务的发现和注册,负载均衡、断路器、REST客户端、请求路由等。
-
Spring Cloud Config 将配置信息中央化保存, 配置Spring Cloud Bus可以实现动态修改配置文件
-
Spring Cloud Bus 分布式消息队列,是对Kafka, MQ的封装
-
Spring Cloud Security 对Spring Security的封装,并能配合Netflix使用
-
Spring Cloud Zookeeper 对Zookeeper的封装,使之能配置其它Spring Cloud的子项目使用
-
Spring Cloud Eureka 是 Spring Cloud Netflix 微服务套件中的一部分,它基于Netflix Eureka 做了二次封装,主要负责完成微服务架构中的服务治理功能。
谈谈微服务
1、微服务是指开发一个单个小型的但有业务功能的服务,每个服务都有自己的处理和轻量通讯机制,可以部署在单个或多个服务器上。微服务也指一种种松耦合的、有一定的有界上下文的面向服务架构。也就是说,如果每个服务都要同时修改,那么它们就不是微服务,因为它们紧耦合在一起;如果你需要掌握一个服务太多的上下文场景使用条件,那么它就是一个有上下文边界的服务,这个定义来自领域驱动设计(DDD: Domain Drive Design)。
简单的说,微服务是系统架构上的一种设计风格,主旨是将一个原本独立的系统拆分成多个小型服务,这些小型服务都在各自独立的进程中运行,服务之间通过基于HTTP/HTTPS协议的RESTful API进行通信协作,也可以通过RPC协议进行通信协作。被拆分成的每一个小型服务都围绕着系统中一些耦合度较高的业务功能进行构建,并且每个服务都维护着自身的数据存储,业务开发,自动化测试案例以及独立部署机制。由于有了轻量级的通信协作基础,所以这些微服务可以使用不同的语言来编写
**2、**传统分布式单体项目的缺点
1、单体应用:
开发速度慢
启动时间长
依赖庞大
等等
2、微服务
易开发、理解和维护
独立的部署和启动
等
不足:
分布式系统-》分布式事务问题
需要管理多个服务-》服务治理
微服务项目的入门搭建
1.建立一个父工程
<?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>
<modules>
<module>ehshop-user</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId> <!--包名-->
<artifactId>spring-boot-starter-parent</artifactId><!--项目名-->
<version>2.0.3.RELEASE</version><!--此项目的版本号-->
</parent>
<groupId>com.qs</groupId>
<artifactId>eshop0813</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.RELEASE</spring-cloud.version><!--声明springcloud的版本,方便下面引用-->
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<!-- dependencies即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项(全部继承)-->
<!-- dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依赖。如果不在子项目中声明依赖,-->
<!-- 是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,-->
<!-- 并且version和scope都读取自父pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。-->
<dependencyManagement>
<dependencies>
<!-- 导入Spring Cloud的依赖管理 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<finalName>eshop</finalName> <!--打包后项目名,http://localhost:8080/eshop-->
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.建一个子项目Module
<?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>com.qs</groupId>
<artifactId>eshop0813</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>com.qs</groupId>
<artifactId>eshop-eureka</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<dependencies>
<!--由于父项目中springcloud是用dependencyManagement,当前子项目不会自己继承,所以我们要手动自己引入依赖,记住不要写版本号,否则不会从父项目那引入-->
<!--下面只引入springcloud的注册中心服务器依赖eureka功能-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3.注册中心
1、什么是注册中心,常用的注册中心有哪些
理解注册中心:服务管理,核心是有个服务注册表,心跳机制动态维护
服务提供者provider: 启动的时候向注册中心上报自己的网络信息
服务消费者consumer: 启动的时候向注册中心上报自己的网络信息,拉取provider的相关网络信息
2、为什么要用?
微服务应用和机器越来越多,调用方需要知道接口的网络地址,如果靠配置文件的方式去控制网络地址,对于动态新增机器,维护带来很大问题
主流的注册中心:
zookeeper、Eureka、consul、etcd 等
3.子项目配置注册中心
server:
port: 8848 #配置服务器端口
eureka:
instance:
hostname: localhost #配置访问的ip
client:
register-with-eureka: false #客户端是否注册
fetch-registry: false #当前是否有业务
service-url:
defaultZone: http://localhost:8848/eureka #去找注册中心的URL
spring:
application:
name: eureka #应用程序的名字
4.主程序的配置
@SpringBootApplication
@EnableEurekaServer//声明是服务器端的注册中心
@EnableEurekaClient//声明是客户端注册中心,如果没什么是不可以注册到注册中心的
public class EshopEurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EshopEurekaApplication.class, args);
}
}
微服务的集群
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XSw0Lyv6-1628917257860)(C:/Users/Administrator/Pictures/springclod/%E5%BE%AE%E6%9C%8D%E5%8A%A1%E9%A1%B9%E7%9B%AE%E7%9A%84%E5%8F%91%E5%B8%83.png)]
为什么要做集群
实现服务器集群主要视为了负载均衡(有两台以上的服务器或者站点提供服务)服务器服务将来自客户端的请求,
考某种算法,尽量平分请求到集群的机器中,从而避免一台服务器因为在太高而出现故障,而即使其中木偶个机器出现故障,
负载均衡会自动规避选择,使得用户也能正常访问服务