首先在学习springCloud之前肯定得要了解下,springCloud到底是个什么东西。
今天这篇文章主要就是介绍下,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/ 显示如下页面则代表注册中心配置完成,但是目前我标红的地方是没有任何东西的,说明我们还得配置对应的客户端,或者说是注册在注册中心的节点或者说是接口。
当然第一步还是引入对应的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。
Feign组件的主要作用就是用来实现服务之间的互相调用,使用一个东西的时候当然了第一件事还是引入对应的依赖啦,这个依赖只需要放在你的调用方的pom文件中,被调用方并不需要引入这个依赖也可以被调用,既然是调用那么肯定是需要有两个客户端咯。那么就需要按照上面的Eureka 服务端注册再创建一个子项目,并且在Eureka server 上进行注册被发现。
org.springframework.cloud spring-cloud-starter-openfeign
@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();
}
熔断器的作用:当你进行接口远程调用的时候,是不是可能会出现对方的客户端宕机的情况,或者由于各种原因访问不上对方的接口,这个时候浏览器是不是就会报错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三大核心组件就到这了,下次有空在再把剩下的给写完。