IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> SpringCloud Alibaba学习(三) -> 正文阅读

[Java知识库]SpringCloud Alibaba学习(三)

OpenFeign

一个声明式的Web服务客户端,让便携而Web服务客户端变的非常容易,只需要一个接口加注解

1.导入依赖

2.服务端写被消费者调用的接口

3.写OpenFeign接口

4.写消费者对外接口-调用OpenFeign接口?

<dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-openfeign</artifactId>
       <version>2.2.6.RELEASE</version>
</dependency>
@Service
@FeignClient(value = "provider")
//value值服务提供者在nacos注册中心的服务名。
public interface OpenFeign {
    @RequestMapping("/index")
    public String index();
}
@RestController
public class OpenFeignController {
    @Resource
    private OpenFeign openFeign;

    @RequestMapping("/consumer/index")
    public String index(){
        return openFeign.index();
    }
    @RequestMapping("/test")
    public String test(){
        return "test";
    }
}

最后别忘了在启动类加OpenFeign的注解?

@SpringBootApplication
@EnableFeignClients
public class FeignConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(FeignConsumerApplication.class, args);
    }

}

?

OpenFeign和Feign和RestTemplate区别

在Feign的基础上支持了SpringMVCD的注解,如@RequestMapping等。OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方法产生实现类,实现类中的做负载均衡并调用其他服务?

Feign是SpringCloud组件中的一个轻量级Restful的HTPP服务客户端Feign内置了Ribbon,用来做客户端负载均衡,去调用服务祖册中心的服务。步骤:使用Feign的注解定义接口,调用这个接口,就可以调用服务注册中心的服务

OpenFeign超时控制

提供者controller方法,故意写个暂停程序3秒

消费者controller方法,OpenFeign默认只等待一秒,超时后报错

?如需等待-解决:设置Feign客户端的超时控制

Properties文件中配置

OpenFeign日志打印功能

提供日志打印功能,可以通过配置来调整日志级别,从而来了解Feign中HTTP请求的细节。即对Feign接口调用情况进行监控和输出

NONE:默认的,不显示任何日志

BASIC:仅记录请求方法、URL、响应状态及执行时间

HEADERS:除了BASIC中定义的信息外,还有请求和响应的头信息

FULL:除了HEADERS中定义的信息外,还有请求和响应的正文及元数据?

配置类

?

Gateway网关路由映射

第一代网关——Zuul

第二代网关——Gateway基于Netty实现,跟Servlet不兼容

所以一定不能出现Spring web的依赖

server.port=8181
spring.application.name=gateway
spring.cloud.gateway.discovery.locator.enabled=true
spring.cloud.gateway.routes.id=provider_route
spring.cloud.gateway.routes.uri=http://localhost:8081
spring.cloud.gateway.routes.predicates=Path=/provider/**
spring.cloud.gateway.routes.filters=StripPrefix=1

routes:即配置第一个映射信息,第二个则routes[1]

将localhost:8081的映射成/provder/**

即provider代表localhost:8081

filters配置把第x个前缀去掉(provider)

第二种:基于nacos因为其已经配好了映射,所以不需要配置路由

引入nacos依赖,注释配置文件的路由配置

<dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>2.2.1.RELEASE</version>
        </dependency>

网关限流

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>2.2.1.RELEASE</version>
        </dependency>
@Configuration
public class GatewayConfiguration {
    private final List<ViewResolver> viewResolvers;
    private final ServerCodecConfigurer serverCodecConfigurer;
    public GatewayConfiguration(ObjectProvider<List<ViewResolver>> viewResolversProvider, ServerCodecConfigurer serverCodecConfigurer) {
        this.viewResolvers = viewResolversProvider.getIfAvailable(Collections::emptyList);
        this.serverCodecConfigurer = serverCodecConfigurer;
    }
    //配置限流的异常处理
    @Bean
    @Order(Ordered.HIGHEST_PRECEDENCE)
    public SentinelGatewayBlockExceptionHandler
    sentinelGatewayBlockExceptionHandler() {
        return new SentinelGatewayBlockExceptionHandler(viewResolvers, serverCodecConfigurer);
    }
    //配置初始化的限流参数
    @PostConstruct
    public void initGatewayRules(){
        Set<GatewayFlowRule> rules = new HashSet<>();rules.add(new GatewayFlowRule("provider_route")
                        .setCount(1)
                        .setIntervalSec(1)
        );
        GatewayRuleManager.loadRules(rules);
    }
    //初始化限流过滤器
    @Bean
    @Order(Ordered.HIGHEST_PRECEDENCE)
    public GlobalFilter sentinelGatewayFilter(){
        return new SentinelGatewayFilter();
    }
//自定义限流异常页面
    @PostConstruct
    public void initBlockHandlers(){
        BlockRequestHandler blockRequestHandler = new BlockRequestHandler() {
            @Override
            public Mono<ServerResponse>
            handleRequest(ServerWebExchange serverWebExchange, Throwable throwable) {
                Map map = new HashMap();
                map.put("code",0);
                map.put("msg","被限流了");
                return ServerResponse.status(HttpStatus.OK)
                                .contentType(MediaType.APPLICATION_JSON)
                                .body(BodyInserters.fromObject(map));
            }
        };
        GatewayCallbackManager.setBlockHandler(blockRequestHandler);
    }
}

导入依赖:Sentinel和gateway的,因为映射不能直接限流,所以要从网关入手;

配置类(直接复制,修改你需要的信息)

需要注意的是Gateway限流只是限制封装后的网址,不会限制原网址

基于API分组限流(路由多的情况,不分的话需要一个个限流)

Provider服务中进行分组,例如1./api/index 2./api/port ==1和2为一个组

?

?基于Nacos进行限流

加入nacos依赖,注释配置文件的路由配置。

注意:如果在nacos的服务名修改了,限流配置类也需要修改,访问网址也需要修改

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-10-31 11:40:46  更:2022-10-31 11:42:55 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 4:43:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码