「环境搭建」SpringCloud环境搭建以及常用组件


什么是Spring Cloud

SpringCloud 是在Spring生态环境下,用于构建可靠微服务应用的一系列组件的统称,提供的功能包括但不限于服务治理,接口式Http调用,负载均衡,服务降级以及熔断,数据健康,网关,配置中心,消息总线等。

SpringCloud中常用组件及作用

  • Eureka:云端服务发现,一个基于 REST 的服务,用于定位服务,以实现云端中间层服务发现和故障转移。
  • OpenFeign:Feign是一种声明式、模板化的HTTP客户端
  • Ribbon:提供云端负载均衡,有多种负载均衡策略可供选择,可配合服务发现和断路器使用
  • Hystrix:熔断器,容错管理工具,旨在通过熔断机制控制服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力
  • Spring Cloud Config:配置管理工具包,让你可以把配置放到远程服务器,集中化管理集群配置,目前支持本地存储、Git以及Subversion
  • Zuul:Zuul 是在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架。Zuul 相当于是设备和 Netflix 流应用的 Web 网站后端所有请求的前门
  • Spring Cloud Bus:事件、消息总线,用于在集群(例如,配置变化事件)中传播状态变化,可与Spring Cloud Config联合实现热部署。
  • Consul:封装了Consul操作,consul是一个服务发现与配置工具,与Docker容器可以无缝集成

Maven环境初步搭建

主项目的依赖引入

<?xml version="1.0" encoding="UTF-8"?>

    4.0.0
 
    
    
        org.springframework.boot
        spring-boot-starter-parent
        2.2.2.RELEASE
    
    org.example
    springcloudtest
    pom
    1.0-SNAPSHOT
    
    
        provider-8100
        provider-8101
        provider-8102
        consumer-8200
        consumer-8201
        eureka-server-8300
        eureka-server-8301
        springcloud-hystrix-dashboard-8400
    
    
        UTF-8
        UTF-8
        1.8
        Hoxton.RELEASE
        1.2.17
    
 
    
        
        
            
            
                org.springframework.cloud
                spring-cloud-dependencies
                Hoxton.RELEASE
                pom
                import
            
 
            
            
                com.alibaba.cloud
                spring-cloud-alibaba-dependencies
                2.1.0.RELEASE
                pom
                import
            
 
            
                log4j
                log4j
                ${log4j.version}
            
        
    
 
    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
                
                    true
                    true
                
            
        
    

Eruaka的使用

Maven引入



	org.springframework.cloud
	spring-cloud-starter-netflix-eureka-server



	org.springframework.boot
	spring-boot-starter-web

配置文件

server:
  port: 8300
spring:
  application:
    name: springcloud-eureka-server-8300
eureka:
  instance:
    ## 此处需要修改DNS 将该域名映射到本机上。不直接用localhost,一个实例只能被一个域名使用
    hostname: server1.com
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/,http://server2.com:8301/eureka/
 

启动两个Eureka服务器实例

@SpringBootApplication
@EnableEurekaServer
public class EurekaServer8300 {
    public static void main(String[] args){
        SpringApplication.run(EurekaServer8300.class, args);
    }
}

创建Provider

<?xml version="1.0" encoding="UTF-8"?>

    
        springcloudtest
        org.example
        1.0-SNAPSHOT
    
    4.0.0
 
    provider-8100
 
    
        
            org.springframework.boot
            spring-boot-starter-web
        
        
            org.springframework.cloud
            spring-cloud-starter-netflix-eureka-client
        
        
            org.projectlombok
            lombok
        
 
    
 
spring:
  application:
    name: provider
server:
  port: 8100
 
eureka:
  instance:
    instance-id: ${spring.application.name}:${server.port}
  client:
    fetch-registry: true
    register-with-eureka: true
    service-url:
      defaultZone: http://server1.com:8300/eureka/,http://server2.com:8301/eureka/
  #Eureka地址
@SpringBootApplication
@EnableDiscoveryClient
public class Provider {
    public static void main(String[] args) {
        SpringApplication.run(Provider.class, args);
    }
}

因此我们就完成了,eureka服务端的集群与客户端的注册

Openfeign的使用

OpenFeign是一个在集成了Ribbon的声明式,模版化客户端,我们先注册三个provider到EruekaServer中

接下来我们再启动一个接入OpenFeign的客户端:消费者

加入maven依赖


	org.springframework.cloud
	spring-cloud-starter-openfeign

给RestTemplate加上负载均衡注解

@Configuration
public class RestConfig {
 
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
 
}

使用@FeignClient定义http客户端

@Component
@FeignClient(name = "provider", fallback = ProductFallbackServieImpl.class)
public interface ProductService {
 
    @GetMapping("/product/provider/serviceInfo")
    String getServiceInfo();
 
    @GetMapping("/product/provider" + "/getById?id={id}")
    String selectById(@PathVariable("id") Long id);
}

定义失败回掉类用于服务降级

@Component
public class ProductFallbackServieImpl implements ProductService{
    @Override
    public String getServiceInfo() {
        return "服务器开小差了";
    }
 
    @Override
    public String selectById(Long id) {
        return "服务器开小差了";
    }
}

最后在启动类上加上@EnableFeignClients注解,然后启动

访问provider接口返回对应的端口信息

如图可以知道,消费者端请求到了不同端口的服务提供者。

Hystrix的使用

引入maven依赖



	org.springframework.cloud
	spring-cloud-starter-netflix-hystrix

服务降级

在微服务中,为避免下游服务异常,导致上游服务异常或资源占用,通常采取特殊处理,来保证服务的正常进行,比如我们在订单服务调用库存服务发生异常时,通常不直接返回异常给用户,而是采用降级函数,替代原函数返回内容,例如上一块内容使用的异常处理函数。

在配置文件上加上:

feign:
  hystrix:
    enabled: true # fegin默认关闭hystrix服务

并在启动类上加上 @EnableCircuitBreaker注解。

我们访问provider一个异常接口,可以看到最终返回了降级函数的内容。

服务熔断

服务熔断发生在服务提供者,当某个接口产生了一定的异常后,将该接口的调用关闭,断路器打开,使用降级函数,一段时间后重新尝试半打开状态,就是尝试放进一些流量,如果正常,则将断路器关闭,避免不必要的资源占用。

@HystrixCommand(
            // 降级函数
            fallbackMethod = "selectByIdFallbackHandler", commandProperties = {
            // 是否启用服务熔断
            @HystrixProperty(name = "circuitBreaker.enabled", value = "true"),
            // 请求阈值
            @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"),
            // 时间窗口
            @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"),
            // 错误比率
            @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "50")
    })

表示请求次数大于10次,且错误比率占50%以上时,打开断路器,10秒后尝试半开状态。

服务端发生的降级函数为 我失败了啊啊啊 

当发生熔断之后,直接调用降级函数

Hystrix- dashboard的使用

应用暴露运行信息

Hystrix-dashboard是Hystrix-dashboard的健康仪表盘,要想被监控,我们首先需要引入一个监控信息依赖



	org.springframework.boot
	spring-boot-starter-actuator

然后添加信息暴露配置

适用于springboot 2.x以上

management:
  endpoints:
    web:
      exposure:
        include: "*"

在应用启动时,我们需要看到一行,表示成功。

2021-09-12 23:45:25.181  INFO 38634 --- [           main] o.s.b.a.e.web.EndpointLinksResolver      : Exposing 17 endpoint(s) beneath base path '/actuator'

新建Hystrix Dashboard项目

添加maven依赖


	org.springframework.cloud
	spring-cloud-starter-netflix-hystrix-dashboard


	org.springframework.boot
	spring-boot-starter-web


	org.springframework.boot
	spring-boot-devtools

启动springboot应用程序

@SpringBootApplication
@EnableHystrixDashboard
public class HystrixDashboard8400 {
    public static void main(String[] args){
        SpringApplication.run(HystrixDashboard8400.class, args);
    }
}

访问HystrixDashboard

如果点击进去一直在loading,需要访问一次添加@HystrixCommand注解的接口,才会开始显示,

如图当失败过多时,断路器开启

当断路器打开时,即使接口参数正确,也直接返回降级函数的内容