• 【Spring Cloud】 总结


    一.Spring Cloud简介

      简单来说,Spring Cloud 就是致力于分布式系统、微服务等的一套在目前非常火热的框架。但它的本身也是一系列框架的有序集合(由多个模块组成)。

      相比较于Dubbo还是有很多不同之处的:例如Dubbo是基于RPC的服务框架,而Spring Cloud是基于RESTful API的服务框架。Dubbo是基于二进制的传输,而Spring Cloud是http协议传输等等。

    二.Spring Cloud的Eureka组件

      1.Eureka的作用

        Eureka和zookeeper类似,能起到一个服务注册中心的作用

      2.使用Eureka

        在Spring Boot主类中添加@EnableEurekaServer注解即可开启Eureka(注意,需要引入相关的依赖,依赖如下)

     <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>

      3.Eureka配置

        在application.properties中配置如下

    spring.application.name=spring-cloud-eureka
    server.port=8060
    eureka.instance.hostname=localhost
    #配置服务中心  应将下列属性设为false
    eureka.client.registerWithEureka=false
    eureka.client.fetchRegistry=false
    #访问路径
    eureka.client.serviceUrl.defaultZone=http://localhost:8060/eureka/

      4.测试服务中心

        启动Spring Boot项目,访问端口后可以看到如下界面

        

      5.服务提供者

        在项目下新建一个Spring Boot项目的Module,并在主类中添加@EnableEurekaClient注解

        在配置文件中添加如下配置

    spring.application.name=spring-cloud-provider
    server.port=8061
    eureka.client.serviceUrl.defaultZone=http://localhost:8060/eureka/

        启动项目后发现服务中心多了一个服务提供者,如下图所示

        

      6.服务消费者

        Spring Cloud创建服务消费者有两种方式,分别是使用Ribbon和使用Feign

        1.Ribbon的方式创建服务消费者

        (1)首先引入相关的依赖

    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
    </dependency>

        (2)在主类中添加@EnableDiscoveryClient注解

        (3)最后在配置文件中配置如下

    spring.application.name=spring-cloud-consumer
    server.port=8063
    eureka.client.serviceUrl.defaultZone=http://localhost:8060/eureka/

        (4)服务消费者调用服务提供者中的方法

        创建RestTemplate对象,并调用该对象的getForObject方法,例如下列代码

        service层

    @Service
    public class MyService {
        @Autowired
        private RestTemplate restTemplate;
    
        public String getPort(){
            //调用服务提供方的方法
            return restTemplate.getForObject("http://spring-cloud-provider:getPort",String.class);
        }
    }

        controller层

    @RestController
    public class MyController {
        @Autowired
        private MyService myService;
    @RequestMapping("/getPort") public String getPort(){ return myService.getPort(); } }

        测试结果如下

        

        如果需要配置负载均衡策略,可以在服务消费者中添加一个配置类,再开启一个其他端口的服务提供者即可

    @Configuration
    public class MyConfig {
        @Bean
        @LoadBalanced
        public RestTemplate restTemplate(){
            return new RestTemplate();
        }
    }

        2.Feign的方式创建服务消费者

        (1)首先引入相关的依赖

    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>

        (2)然后在主类中添加 @EnableFeignClients 和 @EnableDiscoveryClient 注解,配置文件与Ribbon的方式类似

        (3)服务消费者调用服务提供者中的方法

        在service层中的代码如下

    @FeignClient(value = "spring-cloud-provider")
    public interface MyService {
        @RequestMapping(value = "getPort" , method = RequestMethod.GET)
        public String getPort();
    
    }

        在controller层中的代码如下

    @RestController
    public class MyController {
        @Autowired
        private MyService myService;
    
        @RequestMapping(value = "getPort" , method = RequestMethod.GET)
        public String getPort(){
            return myService.getPort();
        }
    }

         由于Feign的方式本身包含有了Ribbon,也实现了负载均衡,面向接口编程,写起来思路更清晰方便,实际开发中应用更广

    三.Spring Cloud 熔断器

      1.Ribbon的方式下添加熔断器

        (1)导入相关的依赖

    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    </dependency>

        (2)在主类中添加 @EnableHystrix 注解开启熔断器

        (3)修改service层中的方法,在方法上添加 @HystrixCommand 注解,例如

        @HystrixCommand(fallbackMethod = "getError")//如果getPort方法执行失败,会直接熔断该方法并执行getError方法(避免浏览器一直去加载)
        public String getPort(){
            //调用服务提供方的方法
            return restTemplate.getForObject("http://spring-cloud-provider:getPort",String.class);
        }
        public String getError(){
            return String.format("获取失败");
        }

      2.Feign的方式下添加熔断器

        (1)Feign自带熔断器,但默认是关闭的,可以在application.properties中开启

    feign.hystrix.enabled=true

        (2)在service层的接口中添加熔断回调方法(在上面的代码的基础上,在@FeignClient 中添加熔断回调如下,如果出现熔断,则执行接口的实现类中的方法)

    @FeignClient(value = "spring-cloud-provider",fallback = MyServiceImpl.class)//如果下面的方法执行失败,会熔断并去执行MyServiceImpl中的方法

        (3)创建接口实现类,例如

    @Component
    public class MyServiceImpl implements MyService {
    
        @Override
        public String getPort() {
            return String.format("获取失败");
        }
    }

      3熔断监控

        如果需要监控熔断信息,可以做如下步骤

        (1)导入相关依赖

    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
    </dependency>

        (2)在主类中添加注解 @EnableHystrixDashboard 开启熔断监控,启动项目,并访问/hystrix,页面如下

        

        (3)添加配置类

    @Configuration
    public class MyConfig {
        @Bean
        public ServletRegistrationBean getServlet(){
            HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
            ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
            registrationBean.setLoadOnStartup(1);
            registrationBean.addUrlMappings("/myhystrix");
            registrationBean.setName("HystrixMetricsStreamServlet");
            return registrationBean;
        }
    }

        (4)在页面中输入路径即(ip+端口号+配置类中的addUrlMappings)可查看熔断信息,例如下图

        

    四.Spring Cloud 网关服务

      1.开启Zuul网关服务步骤如下

        (1)引入相关依赖

    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
    </dependency>

        (2)在主类中添加 @EnableEurekaClient 和 @EnableZuulProxy 注解开启相应的服务

        (3)在配置文件中配置如下

    spring.application.name=spring-cloud-zuul
    server.port=8065
    eureka.client.serviceUrl.defaultZone=http://localhost:8060/eureka/
    #指定网关路径,并设置其映射路径
    zuul.routes.api-a.path=/api/ribbon/**
    zuul.routes.api-a.serviceId=spring-cloud-consumer-ribbon
    zuul.routes.api-b.path=/api/feign/**
    zuul.routes.api-b.serviceId=spring-cloud-consumer-feign

        (4)启动项目,可以通过网关来访问项目,例如下图

        

      2.网关路由失败回调

        编写一个回调实体类,并实现 FallbackProvider 接口即可,详细可以参考官方api文档

      3.zuul过滤功能

        编写一个过滤器,并实现ZuulFilter接口即可

    五.Spring Cloud 配置中心

      1.服务端配置

        (1)导入相关依赖并在主类中开启@EnableEurekaClient 和 @EnableConfigServer注解

        (2)在配置文件中配置如下(以github作为配置文件存放中心)

    spring.application.name=spring-cloud-config
    spring.cloud.config.label=master
    #gitHub仓库地址
    spring.cloud.config.server.git.uri=git@github.com:RetimeFor/spring-cloud-config-test.git
    #存放配置文件的文件夹(相对以上仓库地址)
    spring.cloud.config.server.git.search-paths=spring-cloud-config/others
    spring.cloud.config.server.username=gitHub账号
    spring.cloud.config.server.password=gitHub密码
    #端口号配置为8888(不要在这里修改)
    server.port=8888
    eureka.client.serviceUrl.defaultZone=http://localhost:8060/eureka/

        (3)测试结果如下(端口后直接跟  /文件的名字/master)

        

      2.客户端配置

         以Feign的服务端为例,只需要将配置文件中的内容用如下代码替换即可

    spring.cloud.config.uri=http://localhost:8888
    spring.cloud.config.name=other
    spring.cloud.config.label=master
  • 相关阅读:
    【解决】Word 在试图打开文件时遇到错误 请尝试下列方法:* xxx * xxx * xxx
    【开源】简单4步搞定QQ登录,无需什么代码功底【无语言界限】
    [经验]无线鼠标和无线键盘真的不能用了?——雷柏的重生之路~
    Git技巧:右键菜单怎么去除?
    07.GitHub实战系列~7.Git之VS2013团队开发(如果不想了解git命令直接学这篇即可)
    Git异常:fatal: V1.0 cannot be resolved to branch.
    06.GitHub实战系列~6.过滤器过滤掉的文件如何上传
    Git异常:Cannot delete the branch 'test1' which you are currently on
    ElasticSearch查询 第四篇:匹配查询(Match)
    字符串的长度,是字符数量,还是字节数量?
  • 原文地址:https://www.cnblogs.com/ywb-articles/p/11073603.html
Copyright © 2020-2023  润新知