Spring Cloud中的初步学习(一)
SpringBoot与Spring Cloud的关系
首先说下自己的学习习惯,1、主要是提出问题,2、相应用什么方案去解决,3、解决方案可能存在哪些优化的地方。
工具之一:maven主要有两个功能,一是通过gav定位获取jar包,一是编译打包
gav定位:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
springboot: 快速开发框架,使用spring提供的多个starter来加载多个相关的依赖,省去了一个一个导入maven包组合的功夫,使得开发方便使用同一版本,使用springmvc可以完全采用注解化。主要在pom.xml中配置:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
这其中注意配置,设定一个空值将始终从仓库中获取,不从本地路径获取。不为空值就是先按照路径查找,再本地库,最后远程库查找。
不过之前自己构建项目的时候因为这个空值找个好久才找到这个出问题了,导致子项目继承父类的时候会报must be “pom” but is “jar”,删去即可
我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:
**springcloud:**目前很完整的一套微服务框架,基于springboot的开发简化了分布式系统基础设施的开发,如注册中心、配置中心、消息总线、负载均衡、断路器、数据监控等。
**springboot与springcloud区别:**springcloud是一系列的框架,可以包含springboot,springboot是一个快速开发框架,注解简化了xml配置,内置Servlet,以java执行程序执行即可。
springcloud具备RPC远程调用技术(微服务开发核心技术),基于springboot默认继承的springmvc,可以实现http+json轻量传输,编写微服务接口。
Spring Cloud解决了什么问题
单体项目产生的问题:
即所有项目集中在一个程序运行,导致问题
1、并发集中:所有访问功能集中在一个应用,有木桶效应,一旦某一功能达到并发上限,其他功能就不能访问了
2、功能耦合:某一功能需要几种功能一起并发。功能复杂时并且业务逻辑开发成本高,不利于不同业务领域的合作。
3、横向拆分:springboot框架可将单体项目进行分布式并行开发,分为控制层、业务层和持久层,不能解决问题1和2.
springcloud解决问题:
spring cloud对项目进行的是纵向拆分,例如淘宝中的订单系统和支付系统属于两个,就算支付失败也不耽误你查看订单,解决了并发集中问题;每个小系统也都实现了控制层、业务层和持久层,可单独考虑逻辑,不用过多考虑其余开发系统中否内容,解决的功能耦合。
微服务中出现的问题:
1、各个小系统之间如何进行调用
2、如果在nginx中进行负载均衡,每个独立的小系统就要被别人负载均衡的调用,upstream配置越配越多,所以既需要负载均衡,又不能用nginx实现大量集群的静态资源配置
3、如果调用其他小系统功能失败,如何处理容错问题,在大项目中不能出现频繁的访问拒绝延迟。
springcloud中拥有很多组件,这里先学习第一个eureka组件,这是springcloud的核心组件。
Eureka组件
通过完成当前所有集群微服务的注册与发现逻辑的核心进程,动态处理所有堵在均衡访问时对集群serverList的管理工作。
解决了微服务中出现的问题二,如下图,多个访问人通过http协议访问同一微服务,就会在注册中心进行信息记录,客户端进行节点发现,找到注册中心对应信息,微服务给访问人。不进行访问,则注册中心删除节点信息,对应微服务不会再提供服务。这个过程不必频繁进行手动配置,实现动态处理。
Eureka服务端配置
服务端(注册中心)pom文件配置:
<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>cn.com</groupId>
<artifactId>erueka-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>erueka-server</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Edgware.RELEASE</spring-cloud.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<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>
</project>
服务端application.properties文件配置:
server.port=8761
# eureka config
# 网络访问的主机名称,通过hostname访问虚拟主机,必须配合dns服务器和hosts文件,erueka.insatance服务端
eureka.insatance.hostname=localhost
# 服务端是否开启作为客户端的角色
eureka.client.registerWithEureka=false
eureka.client.fetchRegistry=false
# 对外暴露注册地址(接口)
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka
服务端启动类:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer // eureka启动注解
public class EurekaServerStarter {
public static void main(String[] args) {
SpringApplication.run(EurekaServerStarter.class,args);
}
}
访问http://localhost:8761,下图 为访问成功
学习时间紧迫。今天先到这,明天继续eureka后半部分