SpringCloud Eureka篇

本文总阅读量
本文最后更新于2 分钟前,文中所描述的信息可能已发生改变。

架构

  • 单体架构
  • 垂直架构
  • 分布式架构
  • SOA架构
  • 微服务架构

注册中心

用于服务注册与服务发现。

  • 实现:
    1. Eureka (Netflix)
    2. Consul (Google)
    3. Nacos (Alibaba)

SpringCloud Eureka部分

Ribbon组件

是一个进程间通信库,可以帮助我们发现服务,里面有实现客户端负载均衡的一些算法,也可自定义负载均衡规则。由 Netflix 开发。
使用:

  1. 导入依赖(在 spring-cloud-start-netflix-eureka-client 中包含此依赖)。
    xml
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
    </dependency>
  2. 在配置类中 RestTemplate 的 @Bean 方法上面加上 @LoadBalanced 注解。
  3. 给RestTemplate传的URL中将ip和端口部分换为服务名,即 http://serviceName/xxx/x 形式即可。

OpenFeign组件

服务接口调用(底层使用了Ribbon),是一个声明式的 Rest 客户端,基于接口注解的方式可以让我们在客户端使用声明式的方式来调用服务而不需要使用 RestTemplate 来进行调用。可以设置日志输出与超时时间。
使用:

  1. 客户端导入依赖:
    xml
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
  2. 启动类上加注解:@EableFeignClients
  3. 编写调用接口:
    java
    @FeignClient("服务名")//RestTemplate的参数有了
    public interface OrderFeign{
        //此方法为controller中的方法
        @GetMapping("/order/{id}")
        public Order findById(@PathVariable("id")Integer id);
    }
  4. 在需要调用服务的地方注入此接口并调用其方法即可。

Hystrix组件

是 Netflix 开源的延迟和容错库,提供了熔断功能,防止服务出现雪崩。
功能:

  • 隔离:隔离各个服务的调用。
  • 降级:调用方降级、服务方降级。为了使得更快的得到反馈。
  • 熔断:一种机制,当调用失败次数达到阈值时会触发,使得整个服务都不可用。间隔一段时间后,当调用又能成功且成功次数达到阈值时则恢复。
  • 限流:不用,一般在Nginx或网关中处理。

使用:

  • 服务方降级:
    1. 服务方导入依赖(feign组件集成了):
      xml
      <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
      </dependency>
    2. 编写降级方法
      java
      //在controller中
          public Order findById_fallback(Integer id){
              //返回一个特殊对象提示调用方此服务出错了
              return new Order();
          }
    3. 在controller方法上使用@HystrixCommand注解配置降级方法@HystrixCommand(fallbackMethod = "findById_fallback")
    4. 启动类上开启Hystrix功能@EnableCircuitBreaker
  • 调用方降级
    1. 实现在调用方中定义的 OrderFeign 接口并重写其方法,并将实现类注入到容器中,重写后的方法被认为是降级方法。
    2. 在 OrderFeign 接口上的 @FeignClient 注解中使用 fallback 属性设置降级处理类@FeignClient(name="服务名",fallback="实现类.class")
    3. 在 yml 中开启 feign 对 Hystrix 的支持。
    yml
    feign:
        hystrix:
            enable: true

Gateway网关

具有路由、过滤、认证、鉴权等功能,类似一个切面。目前网关的解决方案有:Nginx+Lua、Netflix的Zuul/Zuul2、Spring Cloud Gateway。

  • 使用:
  1. 依赖引入
xml
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
  1. 启动类上加上注解@EableEurekaClient
  2. 配置文件
yml
server:
  port: 9000
spring:
  application:
    name: api-gateway
  cloud:
    gateway:
      routes:
        - id: eureka-provider
          # 静态路由
          # uri: http://localhost:8081
          # 动态路由
          uri: lb://eureka-provider
          predicates:
            - Path=/order/**
          filters: #内置局部过滤器
            - AddResponseHeader=master1,holo
      default-filters: #内置全局过滤器
        - AddResponseHeader=my,zz
eureka:
  instance:
    hostname: localhost
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka
  • 过滤功能(自定义全局过滤器) 分为pre与post过滤器,即在网关转发之前执行与响应之前执行,可以让我们对请求与响应做一些处理。
java
@Component
public class IpFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        ServerHttpResponse response = exchange.getResponse();
        String ipAddress = request.getRemoteAddress().getAddress().getHostAddress();
        System.out.println("ipAddress = " + ipAddress);
        String badIp = "192.168.206.1";
        if(badIp.equals(ipAddress)){
            response.setStatusCode(HttpStatus.UNAUTHORIZED);
            return response.setComplete();
        }
        return chain.filter(exchange);
    }
    //过滤器的执行顺序,返回值越小越先执行
    @Override
    public int getOrder() {
        return 0;
    }
}

SpringCloud Config配置中心组件

也是一个单独的web程序,可以将配置文件放置到远程仓库让服务去自行读取。

使用:

  1. 依赖引入
xml
<!--配置中心依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-server</artifactId>
</dependency>
  1. 启动类上使用注解@EnableConfigServer
  2. 配置文件
yml
server:
  port: 9010
spring:
  application:
    name: config-server
  cloud:
    config:
      server:
        git:
          uri: https://gitee.com/LoveHelo/my-config-address.git # 远程仓库路径
      label: master #分支名
  1. 需要读取配置文件的微服务中(该服务可以不需要加载本地的配置文件了)
    • 依赖引入
    xml
    <!--配置中心依赖-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-config</artifactId>
    </dependency>
    <!--使得bootstrap.yml生效,因为新版本SpringCloud禁用了bootstrap-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-bootstrap</artifactId>
    </dependency>
    • bootstrap配置文件
    yml
    spring:
      cloud:
        config:
          uri: http://localhost:9010 # 配置中心的地址
          name: provider #文件名
          profile: dev # provider-dev.yml
          label: master # 分支
  2. 刷新客户端 可以导入以下依赖并在 controller 层的类上添加注解 @RefreshScope ,然后发送一个post请求到该客户端的路径 http://ip:port/actuator/refresh 即可通知客户端刷新。可以使用curl工具发送:在cmd下输入curl -X POST http://localhost:8081/actuator/refresh

依赖导入:

xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

配置文件中添加:

yml
# 开启全部端点
management:
  endpoints:
    web:
      exposure:
        include: '*'
  1. 配置中心集成Eureka
  • 配置中心引入spring-cloud-starter-netflix-eureka-client依赖,并在启动类上加上@EnableEurekaClient,配置文件中指定注册中心的地址:
yml
eureka:
  instance:
    hostname: localhost
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka

在客户端的 bootstrap.yml 文件修改为:

yml
spring:
  cloud:
    config:
      # uri: http://localhost:9010 # 配置中心的地址,没有集成Eureka的使用
      name: provider #文件名
      profile: dev # provider-dev.yml
      label: master # 分支
      discovery:
        enabled: true
        service-id: config-server
management:
  endpoints:
    web:
      exposure:
        include: '*'
SpringCloud Alibab篇
常用算法
Valaxy v0.18.5 驱动 | 主题 - Yun v0.18.5
本站总访问量
本站访客数 人次
本站已运行0 天0 小时0 分0 秒后缀