SpringCloud
相关资料
springcoud入门
springcoud入门
Eureka
Ribbon
Eureka集群
Hystrix
gateway
gateway过滤器
SpringCloud的五大功能
- Eureka:服务治理组件,包含服务注册与发现
- Ribbon:客户端负载均衡的服务调用组件
- Hystrix:容错管理组件,实现了熔断器
- Zuul:网关组件,提供智能路由、访问过滤等功能
- Config:外部化配置组件
一个文件夹整合整个项目
- 新建一个maven项目
- 把src删了,把pom.xml改了
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.1.RELEASE</version>
<relativePath/>
</parent>
<groupId>com.pdt</groupId>
<artifactId>pdt</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
- 后续的所有模块都添加在这个文件夹里,用module新建maven项目
- 如果没有多个域名的服务器做测试需要在本地把host文件改了
127.0.0.1 eureka7001
127.0.0.1 eureka7002
127.0.0.1 eureka7003
Eureka中的三大角色
- Eureka Server:服务的注册与发现
- Service provider 服务的提供者,将服务注册到Eureka,当中
- Servce consumer 服务发消费者 ,从Eureka服务列表中获得服务,然后进行消费
Eureka管理者,就是zookeeper
- 其实就是这个maven
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
###服务端口号
server:
port: 7001
eureka:
instance:
hostname: eureka7001
client:
fetch-registry: false # 不用检索服务 自己是注册中心
register-with-eureka: false #不向注册中心注册自己
// 服务端集群配置
service-url:
defaultZone: http://eureka7001:7001/eureka
@EnableEurekaServer
@SpringBootApplication
public class Eureka7001Application {
public static void main(String[] args) {
SpringApplication.run(Eureka7001Application.class,args);
}
}
- 启动后访问
http://localhost:7001
看到一个网站
Eureka功能提供者
- 其实就是这个maven
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
# 服务提供者yml配置
server:
port: 8001
spring:
application:
name: provider
eureka: #设置eureka注册服务的地址
client:
service-url:
defaultZone: http://eureka7001:7001/eureka/
instance:
instance-id: microservice-provider-dept-8001 #配置服务的别名
prefer-ip-address: true # 注册的时候使用ip注册
@SpringBootApplication
@EnableEurekaClient
public class provider{
public static void main(String[] args) {
SpringApplication.run(provider.class, args);
}
}
- 暴露服务,就是正常的一个MVC接口就行
- 把上面的功能模块启动后,就能在服务管理者刚才的网站上看到一个provider服务
Eureka消费者
- 跟功能提供者一样的新建思路,maven依赖也一样
- 添加ribbon的maven依赖,ribbon往下看,这里直接用
- 功能提供者也能是消费者,相互调用
- 这是是表示入口消费者,也就是自定义网关,需要有一个入口把所有的服务都总结起来,所有人都访问这个入口就行,如果有多个一样的入口,就需要用nginx轮询代理
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
- yml配置
server:
port: 80
eureka:
client:
service-url:
#eureka发现服务的列表
defaultZone: http://eureka7001:7001/eureka
#自己不能注册 自己只需要通过eureka发现服务
register-with-eureka: false
- 修改入口文件,添加注解
@SpringBootApplication
@EnableDiscoveryClient
public class consumer{
public static void main(String[] args) {
SpringApplication.run(consumer.class, args);
}
@Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}
}
@Service
public class testService {
@Autowired
RestTemplate restTemplate;
public String test(String name) {
// 把服务提供者的spring.application.name填进来 + service名字
String str = restTemplate.getForObject("http://provider/test,String.class,name);
return str;
}
}
Ribbon
负载均衡的功能模块,这里有个知识点,负载均衡有两种模式,一种是集中式,一种是进程式,nginx就是集中式,由nginx安排请求给服务,而ribbon是进程式,请求先获取我有几个服务可以选,然后自己选,具体怎么用
- 服务提供者复制几份一样的,只修改自己的端口,其他不变
- 给消费者添加ribbon的maven依赖,添加注解
@LoadBalanced
就行了 - 这个默认是使用轮询的,也可以自定义
gateway
- 因为自定义网关太麻烦了,所以需要使用专业网关zuul
- 这个是zuul的升级版,现在用这个了
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
server:
port: 80
spring:
application:
name: gateway
cloud:
gateway:
discovery:
locator:
enabled: true
eureka:
client:
service-url:
defaultZone: http://eureka7001:7001/eureka/
- 就依赖和配置启动就行,然后刷新eureka控制台可以看到服务,访问
http://localhost/ORDER/xxx
就能看到效果,中间的注册ID是大写的 - 过滤器,比如白名单,黑名单,登陆状态等等
// 全局过滤器
@Component
public class MyGlobalFilter implements GlobalFilter, Ordered {
@Override
public int getOrder() {
return 0;
}
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
RequestPath path = exchange.getRequest().getPath();
System.out.println(path);
return chain.filter(exchange);
}
}
Eureka-server集群
- 复制几份,【7001,7002,7003】,修改配置
server:
port: 7001
eureka:
instance:
hostname: eureka7001
client:
fetch-registry: false # 不用检索服务 自己是注册中心
register-with-eureka: false #不向注册中心注册自己
service-url:
defaultZone: http://eureka7002:7002/eureka,http://eureka7003:7003/eureka
server:
port: 7002
eureka:
instance:
hostname: eureka7002
client:
fetch-registry: false # 不用检索服务 自己是注册中心
register-with-eureka: false #不向注册中心注册自己
service-url:
#集群版本 配置7001 7003eureka服务的地址信息
defaultZone: http://eureka7001:7001/eureka,http://eureka7003:7003/eureka
server:
port: 7003
eureka:
instance:
hostname: eureka7003
client:
fetch-registry: false # 不用检索服务 自己是注册中心
register-with-eureka: false #不向注册中心注册自己
service-url:
defaultZone: http://eureka7001:7001/eureka,http://eureka7002:7002/eureka
- 修改所有服务提供者的配置
eureka: #设置eureka注册服务的地址
client:
service-url:
defaultZone: http://eureka7001:7001/eureka,http://eureka7002:7002/eureka,http://eureka7003:7003/eureka
- 修改所有服务消费者的配置
eureka:
client:
service-url:
#eureka发现服务的列表
defaultZone: http://eureka7001:7001/eureka,http://eureka7002:7002/eureka,http://eureka7003:7003/eureka
Hystrix
熔断机制,就是在同个服务的同个类里添加处理异常的方案,目的是为了在链式调用里防止某个环节断裂
- 在【Eureka消费者】不变的情况下加maven依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
- 在原来的基础上改入口文件添加注解
@EnableCircuitBreaker
public class TestApp {
...
}
- 在原来的基础上改代码
@Service
public class testService {
@Autowired
RestTemplate restTemplate;
@HystrixCommand(fallbackMethod = "testHystrix")
public String test(String name) {
String str = restTemplate.getForObject("http://app-item/item,String.class,name);
sout(str)
return str;
}
public String testHystrix(String name) {
return "熔断了";
}
}
config
- 集体配置,让客户端访问服务端,服务端再去访问git/svn,好像没什么意义
nacos
- 阿里的Eureka,跟zk一样是下载个服务,启动后当做远程注册机
Feign
- 这个是ribbon的升级版
- 麻烦
Sentinel
- 阿里的Hystrix