首先在学习springCloud之前肯定得要了解下,springCloud到底是个什么东西。
springCloud简介:
- 什么是springCloud?
Spring Cloud 是一系列框架的有序集合。它利用 Spring Boot 的开发便利性巧妙地简化了分 布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、 熔断器、数据监控 等,都可以用 Spring Boot 的开发风格做到一键启动和部署。Spring 并没有重复制造轮子,它只是 将目前各家公司开发的比较成熟、经得起实际考验的服务框 架组合起来,通过 Spring Boot 风格进 行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分 布式系统开发工具包。
Spring Cloud 项目的官方网址:http://projects.spring.io/spring-cloud/ - SpringCloud 与 SpringBoot 的关系
Spring Boot 是 Spring 的一套快速配置脚手架,可以基于 Spring Boot 快速开发单个微服务, Spring Cloud 是一个基于 Spring Boot 实现的云应用开发工具;Spring Boot 专注于快速、方便集 成的单个微服务个体,Spring Cloud 关注全局的服务治理框架; Spring Boot 使用了默认大于配置 的理念,很多集成方案已经帮你选择好了,能不配置就不配置,Spring Cloud 很大的一部分是基于 Spring Boot 来实现,可以不基于 Spring Boot 吗?不可以。Spring Boot 可以离开 Spring Cloud 独立使用开发项目,但是 Spring Cloud 离不开 Spring Boot,属于依赖的关系。 - springCloud 主要框架(组件)
服务发现——Netflflix Eureka
服务调用——Netflflix Feign
熔断器——Netflflix Hystrix
服务网关——Netflflix Zuul
分布式配置——Spring Cloud Config
消息总线 —— Spring Cloud Bus
1.创建Eureka 注册中心
今天这篇文章主要就是介绍下,springCloud的前三个组件,也就是
Netflflix Eureka(相当于一个注册中心):首先需要有一个服务端,来做注册中心,然后其他的组件或者说模块就全部注册在这个注册中心中,由这个注册中心去发现,所以也叫服务发现。下面先上代码来演示下Netflflix Eureka的用法。
以下是父项目的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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.sz.yang</groupId>
<artifactId>yang_parent</artifactId>
<packaging>pom</packaging>
<version>1.0</version>
<!--导入子项目-->
<modules>
<module>yang_server</module>
<module>yang_user</module>
<module>yang_city</module>
</modules>
<properties>
<java.version>1.8</java.version>
</properties>
<!--引入springboot框架;-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>
<relativePath/>
</parent>
<!--锁定springcloud的版本号-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<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>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<repositories>
<repository>
<id>spring‐snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>spring‐milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring‐snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
<pluginRepository>
<id>spring‐milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</project>
引入eureka组件的核心依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
yml文件中的配置
#重新设置注册中心的端口号
server:
port: 8888
#配置注册中心
eureka:
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://localhost:${server.port}/eureka
在启动类中添加@EnableEurekaServer注解,到此注册中心正式配置完成,启动后就可以看到下图
启动组件后访问http://localhost:8888/ 显示如下页面则代表注册中心配置完成,但是目前我标红的地方是没有任何东西的,说明我们还得配置对应的客户端,或者说是注册在注册中心的节点或者说是接口。
1.1.2Eureka 服务端注册
当然第一步还是引入对应的pom依赖了。
eureka:
client:
service-url:
defaultZone: http://localhost:8888/eureka
这个配置就是把这个客户端注册在8888端口的这个server下。
当然了这样还没有结束,还需要在启动类上添加@EnableEurekaClient注解。
#pom依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
#yml文件配置
server:
port: 9090
#设置项目名
spring:
application:
name: pingan-citys
eureka:
client:
service-url:
defaultZone: http://localhost:8888/eureka
instance:
prefer-ip-address: true
当做完上面的配置后,把server跟刚刚创建的子项目一起启动你就会发现刚刚没有任何数据的地方出现了数据了,这就是说明这个服务已经在注册中心注册了。
PINGAN-USERS这个就是你在yml中配置的applicationame。
1.2Feign组件
Feign组件介绍:
Feign组件的主要作用就是用来实现服务之间的互相调用,使用一个东西的时候当然了第一件事还是引入对应的依赖啦,这个依赖只需要放在你的调用方的pom文件中,被调用方并不需要引入这个依赖也可以被调用,既然是调用那么肯定是需要有两个客户端咯。那么就需要按照上面的Eureka 服务端注册再创建一个子项目,并且在Eureka server 上进行注册被发现。
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
@FeignClient注解中的name是你需要调用的客户端的名称,也就是对方的客户端yml中配置的applicationname,@GetMapping("/citys/list") 中的url也是你需要访问对方客户端接口的Url。最后写个Controller接口调用这个接口就可以实现两个客户端的相互调用了。citysClient这个注入的时候会飘红,但是不用担心这个是正常的,是由于在项目没启动的时候citysClient并没有被注入,所以idea工具就会检测报红,但是在所有项目启动后,这个citysClient就会被注入,所以并不需要担心这个飘红会影响到代码运行。
@FeignClient(name = "pingan-citys")
public interface CitysClient {
@GetMapping("/citys/list")
public List<City> getAllCity();
}
@Autowired
private CitysClient citysClient;
@RequestMapping("/citys/list")
public List<City> getAllCity(){
return citysClient.getAllCity();
}
1.3配置熔断器:hystrix
熔断器的作用:当你进行接口远程调用的时候,是不是可能会出现对方的客户端宕机的情况,或者由于各种原因访问不上对方的接口,这个时候浏览器是不是就会报错500,这样就对用户的体验非常不好,所以呢springCloud作为一个强大的框架,当然也考虑到了这一点,所以就有了hystrix(熔断器)。熔断器顾名思义就是起的熔断作用,比如去年的美股连续一星期每天都有一次熔断,也就是暂停交易。所以到了我们java这里也是这样,既然我访问不了你,那么我就把这个远程调用给熔断,熔断之后显示我们配置好的提示,给用户带来良好的体验,而不是一串的报错500。
配置熔断器:首先yml设置成true就是代表开启的熔断。但是这还不算完,刚刚不是说了还得配置熔断后显示的信息吗。在@FeignClient中配置fallback =你的远程调用接口的实现类,然后对应的实现类我这边就不po出来了,直接实现这个接口然后重新这个接口就可以了,需要显示什么信息就看自己设计就行。
#配置熔断
feign:
hystrix:
enabled: true
@FeignClient(name = "pingan-citys",fallback = CitysClientImpl.class) //如果pingan-citys中的功能雪崩,则自我熔断!
public interface CitysClient {
@GetMapping("/citys/list")
public List<City> getAllCity();
}
好了今天的springCloud三大核心组件就到这了,下次有空在再把剩下的给写完。