SpringCloud微服务解决方案

SpringCloud

  1. SpringCloud是一系列框架的集合, 是微服务思想的落地, 可以快速搭建分布式系统.

微服务简介

  1. 微服务框架
    • 单一职责:微服务中每一个服务都对应唯一的业务能力,做到单一职责
    • 微:微服务的服务拆分粒度很小,例如一个用户管理就可以作为一个服务。每个服务虽小,但“五脏俱全”。
    • 面向服务:面向服务是说每个服务都要对外暴露服务接口API。并不关心服务的技术实现,做到与平台和语言无关,也不限定用什么技术实现,只要提供Rest的接口即可。
    • 自治:自治是说服务间互相独立,互不干扰
      • 团队独立:每个服务都是一个独立的开发团队,人数不能过多。
      • 技术独立:因为是面向服务,提供Rest接口,使用什么技术没有别人干涉
      • 前后端分离:采用前后端分离开发,提供统一Rest接口,后端不用再为PC、移动段开发不同接口
      • 数据库分离:每个服务都使用自己的数据源
      • 部署独立,服务间虽然有调用,但要做到服务重启不影响其它服务。有利于持续集成和持续交付。每个服务都是独立的组件,可复用,可替换,降低耦合,易维护

SpringCloud和SpringBoot版本对应关系

在这里插入图片描述

SpringCloud特性

  1. 服务注册与发现
  2. 负载均衡
  3. 服务之间调用
  4. 容错、服务降级、断路器
  5. 消息总线
  6. 分布式配置中心
  7. 链路追踪

SpringCloud核心组件–Eureka

  1. Eureka : 注册中心, 下图为基本架构
    在这里插入图片描述
    • Eureka : 服务注册中心,对外暴露自己的地址
    • 提供者 : 启动后向Eureka注册自己信息,(地址,提供什么服务)
    • 消费者 : 向Eureka订阅服务,Eureka会将对应服务的所有提供者地址列表发送给消费者,并且定时更新.
    • 心跳 : 提供者定期通过http方式向Eureka刷新自己的状态.
  2. Eureka的快速入门 – 服务端
    1. 创建Springboot项目并添加Eureka依赖

       <dependencies>
              <!-- Eureka服务端 -->
              <dependency>
                  <groupId>org.springframework.cloud</groupId>
                  <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
              </dependency>
        </dependencies>
      
    2. 加上注解

      @EnableEurekaServer     // 声明这个应用是一个EurekaServer
      @SpringBootApplication(exclude= {DataSourceAutoConfiguration.class})
      public class EurekaDemoApplication {
          public static void main(String[] args) {
              SpringApplication.run(EurekaDemoApplication.class,args);
          }
      }
      
    3. 进行配置

      server:
        port: 10086  # 端口
      
      spring:
        application:
          name: eureka-server # 应用名称,会在eureka中显示
      
      eureka:
        client:
          register-with-eureka: false # 是否注册自己的信息到EurekaServer,默认是true
          fetch-registry: false # 是否拉取其它服务的信息,默认是true
          service-url: # EurekaServer的地址,现在是自己的地址,如果是集群,需要加上其它Server的地址。
            defaultZone: http://127.0.0.1:10086/eureka
      
  3. Eureka的快速入门 – 客户端
    1. 添加依赖 : 把服务端依赖server改为client即可
    2. 加上注解 : 把@EnableEurekaServer改为@EnableDiscoveryClient // 开启EurekaClient功能
    3. 进行配置 :
      server:
        port: 10000  # 端口
      
      spring:
        application:
          name: user-provider# 应用名称,会在eureka中显示
      
      eureka:
        client:
          service-url: # 向服务端注册信息
            defaultZone: http://127.0.0.1:10086/eureka
         server:
      	    eviction-interval-timer-in-ms: 30000  # 服务续约(renew)的间隔
      	    lease-expiration-duration-in-seconds: 90000 # 服务失效时间
      
  • 小提示 : -Dserver.port=8088 等同于修改了server的端口号

负载均衡Robbin

  1. 通过负载均衡算法,在多个实例列表中进行选择,从而实现负载均衡的功能.
  2. 使用 :
    1. 在RestTemplate 上添加@LoadBalanced注解

      @Bean
          @LoadBalanced
          public RestTemplate restTemplate(){
              return new RestTemplate();
          }
      
    2. 修改URL表达式 :

       // 地址直接写服务名称即可
       String baseUrl = "http://user-service/user/";
      

Hystix

  1. 概念 : Hystix,即熔断器。是Netflix开源的一个延迟和容错库,用于隔离访问远程服务、第三方库,防止出现级联失败。
    在这里插入图片描述
  2. 解决的问题 : 雪崩效应
    远程调用微服务时,如果有一个服务挂掉啦,调用该服务的进程都会出现问题,调用的多啦都无法实现功能且占用系统资源,引起系统雪崩效应.
  3. 使用 :
    1. 消费端添加依赖 :

      <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
      </dependency>
      
    2. 启动类上加上注解 : @EnableCircuitBreaker

    3. 编写降级逻辑 : 成功的话正常操作,失败友好处理.

       @HystrixCommand(fallbackMethod = "queryUserByIdFallback")
       public String xxx(xx){
      	 xx;
      	 return : "xx"
       }
        public String queryUserByIdFallback(xx){
        	xx;
        	 return : "服务器太忙,请稍后重试"
      }
      
    4. 为了简化开发,通常在类上添加@DefaultProperties(defaultFallback = “queryUserByIdFallback”) 在方法上声明使用熔断隔离 @HystrixCommand()

    5. 自定义超时时长 :

      hystrix:
        command:
        	default:
              execution:
                isolation:
                  thread:
                    timeoutInMillisecond: 6000 # 设置hystrix的超时时间为6000ms
      
  4. 熔断原理 :
    1. 就跟电路上的闸差不多。它有三种状态:关闭,开启和半开。最开始是关闭状态的,这个时候所有请求都可以通过;如果错误请求达到一定的阈值,就会变成开启状态,就会让所有请求短路,直接返回失败的响应;一段时间后,断路器会变成半开状态,如果下一个请求成功了,就关闭断路器,反之就开启断路器。”
    2. 如何设置
      1. hystrix.command.default.circuitBreaker.requestVolumeThreshold(当在配置时间窗口内达到此数量的失败后,进行短路。默认20个)简言之,10s内请求失败数量达到20个,断路器就会变成打开状态。
      2. hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds(短路多久以后开始尝试是否恢复,默认5s)
      3. hystrix.command.default.circuitBreaker.errorThresholdPercentage(出错百分比阈值,当达到此阈值后,开始短路。默认50%)

Feign

在这里插入图片描述

  1. 为什么叫伪装?
    Feign可以把Rest的请求进行隐藏,伪装成类似SpringMVC的Controller一样。你不用再自己拼接url,拼接参数等等操作,一切都交给Feign去做。
  2. 快速入门
    1. 创建maven项目并导入依赖

      <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-openfeign</artifactId>
      </dependency>
      
    2. 创建feign的客户端

      @FeignClient("user-service")
      public interface UserFeignClient {
      
          @GetMapping("/user/{id}")
          User queryUserById(@PathVariable("id") Long id);
      }
      
      • 首先这是一个接口,Feign会通过动态代理,帮我们生成实现类。这点跟mybatis的mapper很像
      • @FeignClient,声明这是一个Feign客户端,类似@Mapper注解。同时通过value属性指定服务名称
      • 接口中的定义方法,完全采用SpringMVC的注解,Feign会根据注解帮我们生成URL,并访问获取结果改造原来的调用逻辑,不再调用UserDao:
    3. 在启动类上开启feign功能

      @SpringBootApplication
      @EnableDiscoveryClient
      @EnableHystrix
      @EnableFeignClients // 开启Feign功能
      public class UserConsumerDemoApplication {
          public static void main(String[] args) {
              SpringApplication.run(UserConsumerDemoApplication.class, args);
          }
      }
      
      1. 比较之前,减去了RestTemplate实例,因为feign内置了RestTemplate.
    4. 负载均衡 : feign集成了ribbon,可以通过服务名.ribbon.xx来对指定服务配置

      user-service:
        ribbon:
          ConnectTimeout: 250 # 连接超时时间(ms)
          ReadTimeout: 1000 # 通信超时时间(ms)
          OkToRetryOnAllOperations: true # 是否对所有操作重试
          MaxAutoRetriesNextServer: 1 # 同一服务不同实例的重试次数
          MaxAutoRetries: 1 # 同一实例的重试次数
      
    5. Hystix支持 : feign默认不开启

      1. 开启hystrix功能
        feign:
          hystrix:
            enabled: true # 开启Feign的熔断功能
        
      2. 使用
        1. 我们要定义一个类,实现刚才编写的UserFeignClient,作为fallback的处理类

          @Component
          public class UserFeignClientFallback implements UserFeignClient {
              @Override
              public User queryUserById(Long id) {
                  User user = new User();
                  user.setId(id);
                  user.setName("用户查询出现异常!");
                  return user;
              }
          }
          
        2. 然后在UserFeignClient中,指定刚才编写的实现类

          @FeignClient(value = "user-service", fallback = UserFeignClientFallback.class)
          public interface UserFeignClient {
          
              @GetMapping("/user/{id}")
              User queryUserById(@PathVariable("id") Long id);
          }
          
    6. 请求压缩 : Spring Cloud Feign 支持对请求和响应进行GZIP压缩,以减少通信过程中的性能损耗。通过下面的参数即可开启请求与响应的压缩功能

      feign:
        compression:
          request:
            enabled: true # 开启请求压缩
          response:
            enabled: true # 开启响应压缩
      

Zuul网关

在这里插入图片描述

  1. Zuul就是网关,起到限流,安全等的作用
  2. 快速入门
    1. 创建maven工程

    2. 添加依赖

    3. 编写启动类

      @SpringBootApplication
      @EnableZuulProxy // 开启Zuul的网关功能
      @EnableDiscoveryClient
      public class ZuulDemoApplication {
      public static void main(String[] args) {
      		SpringApplication.run(ZuulDemoApplication.class, args);
      	}
      }
      
    4. 编写配置

      server:
        port: 10010 #服务端口
      spring: 
        application:  
          name: api-gateway #指定服务名
      
    5. 编写路由规则

      eureka:
        client:
          registry-fetch-interval-seconds: 5 # 获取服务列表的周期:5s
          service-url:
            defaultZone: http://127.0.0.1:10086/eureka
        instance:
          prefer-ip-address: true
          ip-address: 127.0.0.1
      zuul:
       routes:
      	user-service: /user-service/** # 这里是映射路径
      
    6. 路由前缀

      zuul:
        prefix: /api # 添加路由前缀
        routes:
            user-service: # 这里是路由id,随意写
              path: /user-service/** # 这里是映射路径
              service-id: user-service # 指定服务名称
      
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring Cloud 微服务架构实战代码是一个基于 Spring Cloud 微服务解决方案的实践项目。它通过将常见的微服务技术组件和应用场景进行集成和示例演示,使读者能够深入了解和学习 Spring Cloud 微服务架构的实际应用。 该项目包含多个模块,其中包括注册中心(Eureka)、配置中心(Config)、网关(Zuul)、负载均衡(Ribbon)、链路跟踪(Sleuth)、熔断器(Hystrix)等,涵盖了微服务架构中的关键技术组件。在实现过程中,项目采用了 Spring Boot 来简化微服务架构的搭建和开发,并以 Maven 进行依赖管理和构建。 通过该项目的学习,读者可以了解到微服务架构的基本概念、实际应用场景和解决方案,掌握 Spring Cloud 微服务架构的相关技术和工具的实际应用,了解微服务架构的开发和部署流程,掌握基于 Spring Boot 的微服务开发和集成方法,从而提高微服务架构的设计实现和部署能力。 总之,Spring Cloud 微服务架构实战代码是一份完整的微服务架构实践项目,它可以帮助读者深入学习和了解微服务架构的实际应用,并具备较高的实际参考价值。 ### 回答2: Spring Cloud是一个开源的微服务架构实战代码,能够让开发人员在构建分布式系统时快速开发和部署微服务。它诞生于Spring项目之上,提供了基于Spring Boot的一套开发工具和服务,可以方便地管理和实现微服务架构的各项需求。 Spring Cloud包含了许多组件,如Eureka、Feign、Hystrix、Zuul等,这些组件都可以独立使用,也可以混合使用,相互之间的集成非常容易。例如,Eureka提供了服务注册与发现的能力,Feign支持微服务之间的远程调用,Hystrix可以提供服务的自我保护机制,Zuul可以提供API网关的功能,等等。 通过使用Spring Cloud,开发人员可以有效地解决微服务中需要处理的分布式问题,例如服务发现、服务注册、服务负载均衡、熔断、容错、路由、安全等等。此外,Spring Cloud还提供了一些常用的开发工具,如Spring Cloud Config,它可以帮助团队在开发和发布过程中有效地管理和配置系统的环境和配置文件。 总之,Spring Cloud是一套非常完善,且易于集成、扩展的微服务架构实战代码,尤其适用于企业级和大型系统的开发。它能够快速地实现微服务的各项技术需求,提高开发效率,使得开发人员更加专注于业务逻辑的开发,而不用再花费大量时间和精力处理微服务本身的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值