cloud学习笔记小结

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=8888

    spring.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");
            }