Spring Cloud

Spring Cloud

1、是什么?

基于springboot搭建的分布式系统框架。是一种微服务架构。包含了很多子项目。
Netflix Eureka:

服务注册与发现组件,用于构建微服务架构中的服务注册中心,服务提供者将自己注册到 Eureka 服务器,服务消费者从 Eureka 服务器获取可用服务的信息。
Spring Cloud Ribbon:

基于负载均衡算法的客户端负载均衡组件,用于在多个服务提供者之间分发客户端请求。
Spring Cloud Feign:

声明式的HTTP客户端,简化了编写服务消费者的代码,通过定义接口来调用远程服务。
Spring Cloud Hystrix:

容错和断路器库,用于处理分布式系统中的故障和延迟,可以防止故障的扩散。
Spring Cloud Zuul:

用于构建 API 网关的组件,允许通过一个统一的入口点访问多个后端服务。
Spring Cloud Config:

配置中心组件,用于集中管理和配置微服务中的配置信息,支持配置的版本管理和动态刷新。
Spring Cloud Sleuth:

分布式跟踪系统,用于跟踪请求在微服务架构中的传播路径和性能。
Spring Cloud Stream:

用于构建消息驱动微服务的组件,简化了消息系统的集成和使用。
Spring Cloud Bus:

事件、消息总线组件,用于在微服务架构中广播配置变更事件,使各个微服务能够动态刷新配置。
Spring Cloud Security:

用于构建安全微服务的组件,提供了基于 OAuth2 的认证和授权功能。
Spring Cloud Data Flow:

用于构建数据微服务和流处理应用程序的组件,支持数据管道的创建、部署和监控。
Spring Cloud Task:

用于构建批处理任务的组件,支持独立的批处理任务的部署和调度。
Spring Cloud Vault:

用于集成 HashiCorp Vault 的组件,用于安全管理和存储敏感信息,如密钥和密码。
Spring Cloud Kubernetes:

用于在 Kubernetes 环境中部署和管理微服务的组件,支持与 Kubernetes 的集成。
Spring Cloud Alibaba:

阿里巴巴开源的 Spring Cloud 扩展,提供了一些额外的组件,如Nacos、Sentinel、Dubbo等,用于构建分布式系统。

2、服务发现与注册 eureka

在springboot 的启动类上加注解:@EnableEurekaServer 申明当前服务为注册中心。
配置文件:

server:
   port: 8761    # 指定端⼝
eureka:
    instance:
        hostname: localhost   # 指定该Eureka实例的名称
    client:
        registerWithEureka: false  # 是否将自己注册到服务中心
        fetchRegistry: false
        serviceUrl:
             defaultZone:http://${eureka.instance.hostname}:${server.port}/eureka/

启动服务,能正常访问 http://localhost:8761/ 则构建了一个简单的注册中心。

3、服务提供者与服务消费者

服务提供者:服务被调用的一方(提供各种接口的应用)
服务消费者:服务的调用方(调用其他服务的接口)

3.1 服务提供者

新建一个服务,作为服务提供者
在springboot 启动类上加
@EnableDiscoveryClient

配置文件如下:

spring:
  application:
    name: hello-spring-cloud-admin-admin # 服务名称
server:
  port: 8085

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/  #指定注册中心的地址

写一个测试接口

 @RequestMapping(value = "/hello")
   public String hello(){
       return "hello SpringCloud";
   }

启动后访问 http://localhost:8761/,能发现 hello-spring-cloud-admin-admin
再访问 http://localhost:8085/hello
成功

3.2 服务消费者

这里会涉及Ribbon 和Feign
基于前面的内容,我们可以创建多个服务提供者假如我们创建了两个服务提供者,,那如何均衡的访问这两个服务,而不是总是访问其中一个呢。Ribbon 就是这一问题的解决方案,而feign则是整合了ribbon,能够通过注解来使用ribbon.

3.2.1 基于ribbon 的服务消费者

首先 提供两个服务提供者,端口分别为8085,8086 ,并启动ereka

创建一个新应用,
配置文件

spring:
  application:
    name: hello-spring-cloud-web-admin-ribbon
  thymeleaf:
    cache: false
    mode: LEGACYHTML5
    encoding: UTF-8
    servlet:
      content-type: text/html

server:
  port: 8764

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

并添加一个配置类:

@Configuration
public class RestTemplateConfiguration {

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

在服务中编写接口

  @RequestMapping(value = "/hi", method = RequestMethod.GET)
    public String sayHi(@RequestParam String message) {
        return restTemplate.getForObject("http://hello-spring-cloud-service-admin/hi?message=" + message, String.class);
    }

如此,启动服务,并多次访问 http://localhost:8764/hi
此时,能发现,服务提供者的调用此时是比较平均的

3.2.1 基于feign的服务消费者

同样的条件

新建一个应用,配置如下

spring:
  application:
    name: hello-spring-cloud-web-admin-feign
  thymeleaf:
    cache: false
    mode: LEGACYHTML5
    encoding: UTF-8
    servlet:
      content-type: text/html

server:
  port: 8765

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

启动类上加注解:@EnableFeignClients

新建一个类在类上加@FeignClient(value=“hello-spring-cloud-service-admin”)

@FeignClient(value = "hello-spring-cloud-service-admin",fallback = AdminServiceHystrix.class)
public interface AdminService {

    @RequestMapping(value = "hi", method = RequestMethod.GET)
    public String sayHi(@RequestParam(value = "message") String message);
}

新建一个接口

@RequestMapping(value = "/hi", method = RequestMethod.GET)
    public String sayHi(@RequestParam String message) {
        return adminService.sayHi(message);
    }

启动,并多次访问 http://localhost:8765/hi

同样的实现的负载均衡。

4、熔断器

雪崩效应:在微服务架构中,通常会有许多服务。而各个服务是相互依赖的,基于此,如果在某个环节,a服务调用b服务时故障,那其他服务在调用a服务的时候,也会故障。并可能会进一步造成整个应用无法使用。这种现象被称为服务雪崩效应。
熔断器:熔断器的原理很简单,如同电⼒过载保护器。它可以实现快速失败,如果它在⼀段时间内侦测到许多类似的错误,会强迫其以后的多个调⽤快速失败,不再访问远程服务器,从⽽防⽌应⽤程序不断地尝试执⾏可能会失败的操作,使得应⽤程序继续执⾏⽽不⽤等待修正错误,或者浪费CPU时间去等到⻓时间的超时产⽣。熔断器也可以使应⽤程序能够诊断错误是否已经修正,如果已经修正,应⽤程序会再次尝试调⽤操作。
个人理解:就是如果a服务可能挂了,那就不再访问a。当a能用的时候再尝试调用。

4.1 Hystrix

基于feign 使用Hystrix很简单
再上一个feign 消费者做一些修改
新加一个类

@Component
public class AdminServiceHystrix implements AdminService {
    @Override
    public String sayHi(String message) {
        return "Hi,your message is :\"" + message + "\" but request error.";
    }
}
@FeignClient(value = "hello-spring-cloud-service-admin", fallback = AdminServiceHystrix.class)
public interface AdminService {

    @RequestMapping(value = "hi", method = RequestMethod.GET)
    public String sayHi(@RequestParam(value = "message") String message);
}

启动之后即可

4.2 Hystrix Dashboard

Hystrix提供l实时监控HystrixCommand的执⾏信息,包括每秒执⾏多少
请求多少成功,多少失败等。
springBoot 启动类上加 @EnableHystrixDashboard
访问
http://localhost:8065/hystrix.stream

5、 配置中心

提供了⼀种在分布式系统中外部化配置服务器和客户端
的⽀持。配置服务器有⼀个中⼼位置,管理所有环境下的应⽤的外部属性。
客户端和服务器映射到相同Spring Eventment 和 PropertySrouce抽象的概
念,所以⾮常适合Spring应⽤,但也可以在任何语⾔开发的任何应⽤中使
⽤。在⼀个应⽤从开发、测试到⽣产的过程中,你可以分别地管理开发、测
试、⽣产环境的配置,并且在迁移的时候获取相应的配置来运⾏
个人理解:我们集约化的配置中心,用于管理各种配置。防止配置不统一,也方便管理
6、网关 api gateway
通过API Gateway,可以统⼀向外部系统提供REST API。

6.1 zuul

Spring Cloud中使⽤Zuul作为API Gateway。Zuul提供了动态路由、监控、回退、安全等功
能。
新建一个应用,
配置文件

spring:
    application:
        name: hello-spring-cloud-web-admin--gateway
server:
    port: 8050
eureka:
    instance:
        hostname: gateway
    client:
        serviceUrl:
            defaultZone: http://gateway:8761/eureka/
zuul:
    routes:
        user: # 可以随便写,在zuul上⾯唯⼀即可;当这⾥的值 = service-id时,service-id可
以不写。
    path: /user/** # 想要映射到的路径
    service-id: hello-spring-cloud-web-admin

在启动类上加@EnableZuulProxy

启动后就可以通过
http://gateway:8050/ + api 去访问所有的服务接口了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

羱滒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值