cloud学习笔记小结
1、请求统一通过API网关(Zuul)来访问内部服务.
2、网关接收到请求后,从注册中心(Eureka)获取可用服务
3、由Ribbon进行均衡负载后,分发到后端具体实例
4、微服务之间通过Feign(包含Ribbon均衡负载)进行通信处理业务
5、Hystrix负责处理服务超时熔断
6、Turbine监控服务间的调用和熔断相关指标
7、浏览器请求-->负载均衡nginx-->zuul集群(登录验证及路由)-->服务消费者-->[注册中心-->]feign/ribbon(负载均衡)-->服务提供者
一、Zuul简介:
- Zuul的主要功能是路由转发和过滤器(可以做权限校验)。路由功能是微服务的一部分,比如/api/user转发到到user服务,/api/shop转发到到shop服务。zuul默认和Ribbon结合实现了负载均衡的功能。
- 在其入口applicaton类加上注解@EnableZuulProxy,开启zuul的功能:
- http://localhost:8080/api-feign/hi?name=forezp->http://localhost:8081/api-feign/hi?name=forezp,以/api-feign/ 开头的请求都转发给service-feign服务
还可以增加拦截器
zuul:
routes:
api-feign:
path: /api-feign/**
serviceId: service-feign #项目地址http://localhost:8081/ 通过注册服务直接指向到服务,且不需要指定端口
二、Ribbon中使用断路器:
- 在程序的启动类Application 加@EnableHystrix注解开启Hystrix:
- 改造service类,在hiService方法上加上@HystrixCommand注解。该注解对该方法创建了熔断器的功能,并指定了fallbackMethod熔断方法hiError,hiService执行失败,熔断方法执行hiError方法直接返回了一个字符串,字符串为"hi,"+name+",sorry,error!"。
-
@HystrixCommand(fallbackMethod = "hiError")
public String hiService(String name) {
return restTemplate.getForObject("http://SERVICE-HI/hi?name="+name,String.class);
}public String hiError(String name) {
return "hi,"+name+",sorry,error!";
}
三、Feign中使用断路器
-
Feign是自带断路器的,需要在配置文件中配置打开它,在配置文件加以下代码:
feign.hystrix.enabled=true -
需要在FeignClient的SchedualServiceHi接口的注解中加上fallback的指定类就行了:
@FeignClient(value = "service-hi",fallback = SchedualServiceHiHystric.class)
public interface SchedualServiceHi {
@RequestMapping(value = "/hi",method = RequestMethod.GET)
String sayHiFromClientOne(@RequestParam(value = "name") String name);
}@Component
public class SchedualServiceHiHystric implements SchedualServiceHi {
@Override
public String sayHiFromClientOne(String name) {
return "sorry "+name;
}
}
四、分布式配置中心(Spring Cloud Config)
- 在spring cloud config 组件中,分两个角色,一是config server,二是config client。
- config-client(项目服务)从config-server获取了foo的属性,而config-server是从git仓库读取的
- config server:程序的入口Application类加上@EnableConfigServer注解开启配置服务器的功能,要在程序的配置文件application.properties文件配置以下:
spring.application.name=config-server
server.port=8888spring.cloud.config.server.git.uri=https://github.com/forezp/SpringcloudConfig/
spring.cloud.config.server.git.searchPaths=respo
spring.cloud.config.label=master
spring.cloud.config.server.git.username=
spring.cloud.config.server.git.password=
############################################################
spring.cloud.config.server.git.uri:配置git仓库地址
spring.cloud.config.server.git.searchPaths:配置仓库路径
spring.cloud.config.label:配置仓库的分支
spring.cloud.config.server.git.username:访问git仓库的用户名
spring.cloud.config.server.git.password:访问git仓库的用户密码http请求地址和资源文件映射如下:config-client配置远程仓库的时候也需要参考
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties - config-client:配置文件bootstrap.properties:
spring.application.name=config-client
spring.cloud.config.label=master
spring.cloud.config.profile=dev
spring.cloud.config.uri= http://localhost:8888/
server.port=8881
#################################################################
spring.cloud.config.label 指明远程仓库的分支
spring.cloud.config.profile:dev开发环境配置文件;test测试;pro正式
spring.cloud.config.uri= http://localhost:8888/ 指明配置服务中心的网址
- @Value("${foo}") String foo; 从配置中心读取的foo变量的值
五、Spring Cloud Gateway
- 通常的作用如下:
协议转换,路由转发
流量聚合,对流量进行监控,日志输出
作为整个系统的前端工程,对流量进行控制,有限流的作用
作为系统的前端边界,外部流量只能通过网关才能访问系统
可以在网关层做权限的判断
可以在网关层做缓存 - 路由功能:
Spring Cloud Gateway是Spring Cloud官方推出的第二代网关框架,取代Zuul网关。网关作为流量的,在微服务系统中有着非常作用,网关常见的功能有路由转发、权限校验、限流控制等作用。spring cloud gateway中使用RouteLocator的Bean进行路由转发,将请求进行处理,最后转发到目标的下游服务。
@Bean
public RouteLocator myRoutes(RouteLocatorBuilder builder) {
return builder.routes()
.route(p -> p
.path("/get")
.filters(f -> f.addRequestHeader("Hello", "World"))
.uri("http://httpbin.org:80"))
.build();
上面创建的route可以让请求“/get”请求都转发到“http://httpbin.org/get”。在route配置上,我们添加了一个filter,该filter会将请求添加一个header,key为hello,value为world。 - 使用Hystrix:
在spring cloud gateway中可以使用Hystrix。Hystrix是 spring cloud中一个服务熔断降级的组件,在微服务系统有着十分重要的作用。
Hystrix是 spring cloud gateway中是以filter的形式使用的,代码如下:
@Bean
public RouteLocator myRoutes(RouteLocatorBuilder builder) {
String httpUri = "http://httpbin.org:80";
return builder.routes()
.route(p -> p
.path("/get")
.filters(f -> f.addRequestHeader("Hello", "World"))
.uri(httpUri))
.route(p -> p
.host("*.hystrix.com")
.filters(f -> f
.hystrix(config -> config
.setName("mycmd")
.setFallbackUri("forward:/fallback")))
.uri(httpUri))
.build();
}
在上面的代码中,我们使用了另外一个router,该router使用host去断言请求是否进入该路由,当请求的host有“*.hystrix.com”,都会进入该router,该router中有一个hystrix的filter,该filter可以配置名称、和指向性fallback的逻辑的地址,比如本案例中重定向到了“/fallback”。
现在写的一个“/fallback”的l逻辑:
@RequestMapping("/fallback")
public Mono<String> fallback() {
return Mono.just("fallback");
}