SpringCloud的其他组件

**一.Spring Cloud Feign**

Feign简介:
Feign译文伪装,Feign是一个声明式WebService客户端,使用Feign能让编写WebService客户端更加简单,它的使用方法是定义一个接口,然后添加@feignClient注解.
Feign集成了Ribbon的负载均衡功能,集成了Hytrix的熔断功能,支持请求压缩,大大简化了远程调用的代码,同时还增强了功能,Feign以更加优雅的方式编写远程调用代码,并简化重复代码.
Feign底层是对RestTemplate的封装.
Feign的快速入门:
使用Feign代替RestTemplate;
实现步骤:
1.导入Feign依赖
2.编写Feign客户端接口
3.消费者启动引导类开启Feign功能注解@EnableFeignClient
4.访问接口测试
实现过程:
在消费者服务中导入依赖:
< dependency>
< groupid>
org.springframework.cloud
< /groupid>
< artifactid>
spring-cloud-starter-openfeign
</ artifactid>
< /dependency>
编写Feign的客户端接口:

@ FeignClient(“在eureka中注册的服务名称”)
public interface UserClient(){
//要调用哪个服务,就复制哪个服务的方法声明.比如要调用 用id查找的方法 就写id的方法声明
}
例如:
@FeignClient(“springcloud-user”)
public interface UserClient {
@GetMapping("/user/{id}")
User queryById(@PathVariable(“id”) Long id);
}
注意:
1.Feign会通过动态代理,帮助我们生成实现类.
2.@FeignClient 声明Feign的客户端,注解的值指明在eureka中注册的服务名称.
3.接口定义的方法,采用SpringMVC 的注解,Feign会帮助我们生成url地址.
4.注解@GetMapper中的/user,不能忘记,因为Feign需要拼接可访问地址.

编写测试类:
用UserClient调用方法:
@RunWith (SpringRunner.class)
@SpringBootTest
public class mainTest {

@Autowired
private UserClient userClient;

@Test
public void test(){
    User byid = userClient.findByid (1);
    System.out.println (byid);
}

}
启动测试:

熔断器支持:
Feign整合Hystrix熔断器
实现步骤:
1.在配置文件application.yml中开启feign熔断器支持.
2.编写FallBack处理类,实现FeignClient客户端
3.在@FeignClient注解中,指定FallBack处理类.
4.在Controller上将原有的hystrix相关注解去掉.
5.测试
实现过程:
1.在配置文件application.yml中开启feign熔断器支持:默认关闭
feign:
hystrix:
enabled:true #开启熔断器的熔断功能
2.定义一个类UserClient/fallBack,实现刚才编写的Feign接口,作为FallBack的处理类. 添加@Component注解,交给框架管理.

@Component
public class UserClientFallBack implements UserClient {
    @Override
    public User queryById(Long id) {
        User user = new User();
        user.setId(id);
        user.setName("用户异常!" );
        return user;
    }
}

3.在@FeignClient注解中,指定FallBack处理类

@FeignClient(value="user-service",fallback= UserClientFallBack.class)
public interface UserClient {
    @GetMapping("/user/{id}")
    User queryById(@PathVariable("id") Long id);
}

4.测试

Feign的日志级别配置:
通过loggin.level.xx=debug 来设置日志级别,然而这个对Feign客户端不会产生效果.因为@FeignClient注解修饰的客户端在被代理时.都会创建一个新的Feign.Logger实例,我们需要额外通过配置类的方式指定这个日志的级别才可以.
实现步骤:
1.在application.yml配置文件中开启日志级别配置.
2.编写配置类,定义日志级别bean
3.在接口的@FeignClient中指定配置类
4.重启项目,测试访问

实现过程:
1.在consumer_service的配置文件中设置com.itheima包下的日志级别都为debug

loggin:
level:
com.itheima:debug
2.在consumer_service编写配置类,定义日志级别,添加配置类注解@Configuration

@Configuration
public class FeignConfig{
@Bean
public Logger.Level feignLogger(){
return Logger.Level.FULL;
}
}

指定的level级别是FULL
Feign支持的四种级别:
NONE:不记录任何日志,默认值
BASIC:仅记录请求的方法,URL以及响应状态码和执行时间.
HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息
FULL:记录所有支持的请求和响应的明细,包括头信息,请求体,元数据,
3.在Consumer_service的FeignClient中指定配置类

@FeignClient(value="user-service",fallback=UserclientFallBack.class,configuration=FeignConfig.class)
public interface UserClient {
    @GetMapping("/user/{id}")
    User queryById(@PathVariable("id") Long id);
}

4.重启项目

注意:Spring Cloud Feign使用三要素:
1.当使用传统url传参的时候,发起请求的一方和接受请求的一方的方法形参上,都必须存在@requestParam注解. 传统的url传参指的是
url?name=xiaoming$age=18 这种方式.
2.当使用restful风格传参,发起请求的一方于接受请求的一方形参上,都必须存在@PathVariable()
3.当被调用接口的远程接口返回值是包装pojo时,那么该包装类中必须由无参构造方法.

二.SpringCloud Gateway
SpringCloud Gateway 是SpringCloud团队的一个全新项目,基于Spring5.0,Spring2.0,ProjectReactor等技术开发的网关,旨在为微服务架构提供一种简单有效的API路由管理方式.
SpringCloud Gateway作为SpringCloud生态系统中的网关,目标是代替Netflix Zuul.GetWay不仅提供一种路由方式,并且基于Filter链的方式提供网关的基本功能,例如:安全,监控/指标,和限流.
其本身也是一个微服务,需要注册到Eureka.
网关的核心功能:过滤,路由
网关的具体工作位置:在用户和为服务之间
微服务架构加入Gateway后
不管是来自客户端的请求还是服务内部调用.一切服务的请求都可经过网关.
网关实现鉴权,动态路由等等操作.
Gateway就是我们服务的统一入口.

Gateway的快速入门:
1.创建gateway-service工程
2.编写基础配置
3.编写路由规则
4.启动网关服务进行测试
实现过程:
1.创建gateway-service工程
添加依赖:
网关依赖
< dependency>
< groupid>
org.framework.cloud
</ groupid>
< artifactid>
spring-cloud-starter-gateway
</ artifactid>
</ dependency>

添加Eureka依赖
< dependency>
< groupid>
org.springframework.cloud
</ geoupid>
< artifactid>
spring-cloud-starter-netfix-eureka-client
</ artifactid>
</ dependency>

编写GatewayApplication启动类
@SpringBootApplication
@EnableDisoverClient
public class GatewayApplication{

public static void main(String[] args){
SpringApplication.run(GatewayApplication.Calss,args)
}
}

编写基础配置:
server:
port:10010
Spring:
application:
name:api-getway
eureka:
client:
registerWithEureka:true
fetchRegistry:true
serviceUrl:#Eureka 客户端于服务端进行交互的地址,多个的话中间用逗号隔开
defaultZone:
${EUREKA_SERVER:http://locaohost:50101/eureka/}
instance:
perfer-ip-address:true #将自己的ip地址注册到Eureka服务中去
ip-address: $ {IP_ADDRESS: 127.0.0.1}
instance-id:
${spring.application.name}: ${server.port}

编写路由规则:

spring:
 cloud:
   gateway:
     routes:
     #id唯一标识,可以自定义
       id:user-service-route
       #路由服务地址
       uri:http://127.0.0.1:9081
       #路由拦截地址
       predicates:
         - path=/user/**

启动测试:将符合path规则的请求,路由到uri参数指定地址。举例:http://localhost:10010/user/2 ==>http://localhost:9091/user/2

动态路由:
在上述的路由规则中,我们把路劲对应的服务地址写死了,如果服务提供者集群的化,这样做不合理,应该是根据服务地址名称,去Erueka注册中心查找服务对应的所有实例列表,然后进行动态路由.
修改映射配置:通过服务名称获取路由服务地址

spring:
  cloud:
    gateway:
      # 路由(集合)
      routes:
          # id唯一标识
        - id: user-service-route
          # 路由地址
          # uri: http://127.0.0.1:9091
          # lb协议表示从Eureka注册中心获取服务请求地址
          # user-service访问的服务名称。
          # 路由地址如果通过lb协议加服务名称时,会自动使用负载均衡访问对应服务
          uri: lb://springcloud-user
          # 路由拦截地址(断言)
          predicates:
            - Path=/user/**

路由配置中uri所用的lb协议,gateway将把user-service解析为实际的主机和端口,并通过Ribbon进行负载均衡.

过滤器:
过滤器的分类:
1.默认过滤器:出厂自带,实现好了拿来就用,不需要实现
全局默认过滤器
局部默认过滤器
2.自定义过滤器:根据需求自己实现,实现后需要配置,才可以使用.

常用默认过滤器:
Add Request Header 对匹配上的请求加上Header
AddRequestParameters 对匹配上的请求路由
AddResponseHeader 对从网关返回的响应Header
StripPrefix 对匹配上的请求路径去除前缀

默认过滤器配置:
默认的过滤器有两种:全局默认过滤器和局部默认过滤器

全局过滤器:对输出响应头设置属性
对输出的响应设置其头部属性名称为Myname,值为itheima
修改配置文件:
spring:
cloud:
default-filters:
- AddResponseHeader=Myname,itheima

局部过滤器:通过局部默认过滤器,修改请求路径.这里介绍两种:
1.添加路径前缀:
在gateway中可以通过配置路由的过滤器PrefixPath实现映射路径中的前缀
修改配置文件:

spring:
  cloud:
    gateway:
      routes:
        - id: user-service-route # 路由id,可以随意写
          # 代理服务地址;lb表示从Eureka中获取具体服务
          uri: lb://springcloud-user
          # 路由断言,配置映射路径
          predicates:
            - Path=/**
          # 请求地址添加路径前缀过滤器
          filters:
            - PrefixPath=/user

配置完成后的效果:
Prefix Path=/user 当访问地址是http://localhost:10010/1 时,路由地址为http://localhost:9091/user/1
2.去除前缀路径
在gateway中通过配置路由过滤器StripPrefix,实现映射路基中地址的去除,通过StripPrefix=1来指定要去掉前缀的个数.比如:路径/api/user/1会被路由到/user/1

配置去除路径前缀过滤器:

spring:
  cloud:
  gateway:
    routes:
    - id: user-servce-route
    uri: lb://springcloud-user
    predicates:
    - PAth=/**
    filters:
    - StipPrefix=1

重启后的访问效果:
配置
StripPrefix=1
访问地址
http://localhost:10010/api/user/1
路由地址
http://localhost:9091/user/1
配置
StripPrefix=2
访问地址
http://localhost:10010/api/user/1
路由地址
http://localhost:9091/1

自定义过滤器:
1.全局过滤器自定义:
实现步骤:
(1).在gateway_service工程编写全局过滤器类MyGLobalFileter 实现GlobalFilter和Order接口
(2)编写业务逻辑代码
(3)访问接口测试,加token和不加token

@Component
public class MyGlobalFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        System.out.println("-----------------全局过滤器MyGlobalFilter---------------------");
        //1、获取参数中的token,以及token的值
        String token = exchange.getRequest().getQueryParams().getFirst("token");
        //2、如果token的值为空,则拦截
        if (StringUtils.isBlank(token)) {
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            return exchange.getResponse().setComplete();
        }
        return chain.filter(exchange);
    }
    /**
     * 定义过滤器执行顺序
     * 返回值越小,越靠前执行
     * @return
     */
    @Override
    public int getOrder() {
        return 0;//
    }
}

注意面试题:项目上线后如何来保证访问的每一个服务的安全性?
答:1,我不会让用户的访问直接到达我的具体的服务,我会让请求到达网关,由网关来路由到具体的服务
2.我对于用户的每一次请求,我会携带令牌,来保护接口的安全性:
3.在部署层面.把服务部署在公司的局域网机房内,把网关部署在外网,由网关来请求代理转发,以此来保护我们的服务.

配置中心SpringCloud Config
Config简介:分布式系统中,由于服务数量非常多.配置文件分散在不同的微服务项目中,管理极其不方便,为了方便配置文件集中管理,需要分布式配置中心组件,在SpringCloud中,提供了spring Cloud Config,它支持配置文件放在配置服务的本地,也支持配置文件放在远程仓库GIt(GitHub,码云).配置中心本质上是一个微服务,同样需要注册在Eureka中心.
在这里插入图片描述首先在GItHub或者码云创建远程仓库:
配置仓库名称和路径,然后创建配置文件.
配置文件的命名方式:{application}-{profile}.yml或者{application}-{profile}.properties
application为应用名称,profile用于区分开发环境dev,测试环境test,生产环境pro等.
比如:
开发环境 user-dev.yml
测试环境 user-test.yml
生产环境 user-pro.yml
将user-service工程里的配置文件application.yml内容复制作为user-dev.yml文件内容.

搭建配置中心微服务
实现步骤:
1.创建配置中心springboot项目config_service
2.配置依赖坐标
3.启动类添加开启配置中心服务注解
4.配置服务中心application.yml文件
5.启动测试

实现过程:
1.创建配置中心微服务工程
2.添加依赖坐标
添加Eureka坐标
< dependency>
< groupid>
org.springframework.cloud
</ groupid>
< artifactid>
spring-cloud-starter-netflix-eureka-client
</ artifactid>
</ dependency>
添加配置中心坐标

< dependency>
< groupid>
org.springframework.cloud
</ groupid>
< artifactid>
spring-cloud-config-server
</ artifactid>
</ dependency>

启动类,创建配置中心工程的启动类.添加@EnableConfigServer注解

@SpringBootApplication
@EnableDiscoveryClient//开启Eureka客户端发现功能
@EnableConfigServer //开启配置服务支持
public class ConfigServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConfigServerApplication.class,args);
    }
}

配置文件:创建配置中心工程的配置文件application.yml

server:
  port: 12000 # 端口号
spring:
  application:
    name: config-server # 应用名
  cloud:
    config:
      server:
        git:
          # 配置gitee的仓库地址,就是码云或GIthub的仓库地址
          uri: https://gitee.com/Hui900521/itheima-springcloud-config.git
 #Eureka服务中心配置
eureka:
  client:
    service-url:
      # 注册Eureka Server集群
      defaultZone: http://127.0.0.1:50101/eureka
#com.itheima 包下的日志级别都为Debug
logging:
  level:
    com: debug

启动测试.

服务去获取配置中心配置
目标:改造user_service工程,配置文件不再由微服务项目提供而是从配置中心获取.
实现步骤:
1.添加配置中心客户端启动依赖
2.修改服务提供者的配置文件
3.启动服务
4.;测试效果
实现过程:
1.添加依赖
< dependency>
< groupid>
org.springframework.cloud
</ groupid>
< artifactid>
spring-cloud-starter-config
</ artifactid>
</ dependency>
2.修改配置
首先删除user_service的application.yml文件
然后创建bootstrap.yml配置文件,名称必须写bootstrap.
配置内容如下:

spring:
  cloud:
    config:
      name: user #与远程仓库中的配置文件的application保持一致
      profile:dev #与远程仓库中的配置文件的profile保持一致
      label:master #与远程仓库中的版本保持一致
      discovery:
        enable:true #使用配置中心
        service-id:config-server #配置中心服务id
 #向Eureka服务中心集群注册服务
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:50101/eureka

关于application.yml和bootstrap.tml文件的说明:
1.bootstrap.yml文件时SpringBoot的默认配置文件,而且其加载时间相比于application.yml更加早.
2.bootstarp.yml和application.yml都是默认配置文件,但是定位不同,bootstrap.yml可以理解成系统级别的一些参数配置,一般不会变动,application.yml用来定义应用级别的参数
3.搭配spring-cloud-config使用application.yml的配置可以动态替换.
4.bootstrap.yml相当于项目启动的引导文件,内容相对固定
5.application.yml文件时微服务的常规配置参数,变化比较频繁

最后启动,测试

消息总线:SpringCloudBus
Bus是用轻量的消息代理将分布式的节点连接起来,可以用于广播配置文件的更改或者服务的监控管理.
Bus可以为微服务做监控,也可以实现应用程序之间的相互通信,Bus可选的消息代理RabbitMQ和kafka.
广播出去的配置文件服务会进行本地存储.
首先介绍什么是消息队列:
消息就是指数据,队列 数据结构 先进先出,消息队列的作用是在多个系统之间进行消息的传递.
消息队列的技术:activemq,rabbitmq,zeromq等等
使用rabbitmq的原因:rabbitmq的工作模式比较多,包括工作队列模式,发布/订阅模式,rpc模式,路由模式,通配符模式.而且对高并发性能支持比较好,但是不支持事务.
消息队列的工作模式:
角色:消息的生产者,消息的消费者 生产者/消费者模型
工作流程:
消息的生产者和消息的消费者是相互独立的两个系统,消息的生产者把消息发送到消息队列中,
生产者只负责把消息发送到消息队列,谁用怎么用都与他无关,消息的消费者时刻监视着消息队列,一发现他要用的消息,他就拿走,并不关心消息是谁发的.消息队列一定会存在分布式中,因为消息队列可以实现解耦.

整合案例:
目标:消息总线整合入微服务系统,实现配置中心的配置自动更新,不需要重启服务.
首先改造配置中心:
1.在config_sercer中加入Bus相关依赖
2.修改application.yml,加入RabbitMQ的配置信息,和暴露触发消息总线地址.
实现过程:
添加依赖:

 <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-bus</artifactId>
  </dependency>
  <!--RabbitMQ依赖-->
  <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-stream-binder-rabbit</artifactId>
  </dependency>

修改application.yml配置文件:

# rabbitmq的配置信息;如下配置的rabbit都是默认值,其实可以完全不配置
spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest
# 暴露触发消息总线的地址
management:
  endpoints:
    web:
      exposure:
        # 暴露触发消息总线的地址
        include: bus-refresh

改造用户服务:
改造步骤:
1.在用户微服务项目中加入Bus的依赖
2.修改用户服务的bootstrap.yml配置文件,加入RabbitMQ的配置信息
3.在控制器上加@RefreshScope注解,就是在UserController上面加注解.
4.测试

实现过程:
1,添加依赖:

<!--消息总线依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-bus</artifactId>
</dependency>
<!--RabbitMQ依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-stream-binder-rabbit</artifactId>
</dependency>
<!--健康监控依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

2.添加RabbitMq配置

# rabbitmq的配置信息;如下配置的rabbit都是默认值,其实可以完全不配置
spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

测试.
消息总系实现消息分发过程:
1.请求地址访问配置中心的消息总线
2.消息总线接受到请求
3.消息总线向消息队列发送消息
4.user_service微服务监听消息队列
5.user_service微服务接到消息队列中消息后
5user_service微服务重新从配置中心获取最新配置信息
SpringCloud总架构图
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值