当前位置: 首页 > news >正文

天津微网站建设百度导航如何设置公司地址

天津微网站建设,百度导航如何设置公司地址,网站推广途径方法,丰浩网站建设中心系列目录 【Spring Cloud Alibaba】#xff08;一#xff09;微服务介绍 及 Nacos注册中心实战 【Spring Cloud Alibaba】#xff08;二#xff09;微服务调用组件Feign原理实战 本文目录系列目录前言一、Feign扩展点配置二、OpenFeign扩展点配置1. 通过配置文件配置有效范… 系列目录 【Spring Cloud Alibaba】一微服务介绍 及 Nacos注册中心实战 【Spring Cloud Alibaba】二微服务调用组件Feign原理实战 本文目录系列目录前言一、Feign扩展点配置二、OpenFeign扩展点配置1. 通过配置文件配置有效范围说明验证是否生效2. 通过Java Bean配置有效范围说明验证是否生效补充说明1. 日志级别补充说明2. 契约contract补充说明3. 编解码器补充说明4. 拦截器补充说明5. 配置Client1). 配置Client为Apache HttpClient2). 配置Client为OkHttp补充说明6. 配置GZIP压缩小结三、源码解读1. 注册流程2. 扩展点配置主逻辑3. 配置文件源头4. Java Bean配置源头最后前言 书接上文我们掌握了Feign的基本使用、核心原理以及Spring Cloud Alibaba如何快速整合Feign真的太简单了你是不是觉得这样就够了但在实际项目使用OpenFeign时我们常常会遇到各种需求需要用到它提供的扩展例如日志分析、自定义统一拦截器、客户端组件配置、GZIP压缩等等这也正是我接下来在本文中分享的内容首先我会从原生Feign扩展点配置入手然后进行OpenFeign扩展点配置实战最后对OpenFeign是如何实现的进行了源码解读内容很详细Let’s go! 一、Feign扩展点配置 在上文我们主要讲解了架构图的上部和下部本文主要针对架构图 的 中间扩展部分 Feign本身提供了很多扩展点例如 日志级别logLevel契约contract客户端client超时设置options编码器encoder解码器decoder拦截器requestInterceptor 这些扩展点我们在使用原生Feign时可以通过Feign.Builder指定最后再通过target生成动态代理类完成Bean注册。 举个例子 Bean public UserService userService() {return Feign.builder().logLevel(Logger.Level.BASIC).contract(new Contract.Default()).client(new Client.Default(null, null)).encoder(new Encoder.Default()).decoder(new Decoder.Default()).target(UserService.class, http://demo-b); }二、OpenFeign扩展点配置 通过上文的OpenFeign实战我们很容易搭建出Spring Cloud Alibaba微服务框架并实现服务之间通过OpenFeign调用。如果还未看过上文的同学建议先看上文【Spring Cloud Alibaba】二微服务调用组件Feign原理实战 我这里准备了3个Spring Cloud Alibaba微服务demo-a、demo-b、demo-c之所以准备3个服务是为了验证配置是全局有效还是局有效 在OpenFeign中扩展配置项可以通过配置文件和Java Bean两种方式接下来我们就配置试试看 1. 通过配置文件配置 application.properties格式 feign.client.config.{服务名}.{配置名} {配置值} 我们配置一些你可能用的上的扩展项比如日志级别配置、契约配置、超时配置、编解码配置、拦截器配置如下 # 日志级别配置 feign.client.config.default.loggerLevel BASIC # 契约配置 feign.client.config.default.contract feign.Contract.Default # 连接超时配置 feign.client.config.default.connectTimeout 5000 # 读取超时配置 feign.client.config.default.readTimeout 30000 # 编码器配置 feign.client.config.default.encoder feign.jackson.JacksonEncoder # 解码器配置 feign.client.config.default.decoder feign.jackson.JacksonDecoder # 拦截器配置, 是数组, 需要自定义RequestInterceptor feign.client.config.default.requestInterceptors[0]com.tiangang.demo.c.interceptor.MyFeignRequestInterceptor有效范围说明 全局生效配置 {服务名} 为 default 如上面例子中所示局部生效配置 {服务名} 为 具体服务名 例如下面的配置仅对调用demo-b服务有效。 feign.client.config.demo-b.loggerLevel BASIC验证是否生效 你知道如何快速验证吗 挨个试 教你一个简单有效的方法 我使用demo-c发起调用可以在启动demo-c 启动服务 时构建 动态代理前 打断点查看Feign.Builder。 即在FeignClientFactoryBean.loadBalance方法的调target之前打断点 配置后的Feign.Builder确认已经按application.properties配置 如果未配置默认的Feign.Builder如下 对于是全局还是局部有效我是确认过的因为不好演示所以大家有兴趣可以自行验证确认 2. 通过Java Bean配置 通过Java代码配置的话需要定义一个配置类例如我命名为FeignConfig里面定义需要配置的Bean与上面配置文件的配置项保持一致为了做区分这里将编解码器改为Gson。 public class FeignConfig {// 日志级别配置Beanpublic Logger.Level feignLoggerLevel() {return Logger.Level.BASIC;}// 契约配置Beanpublic Contract feignContract() {return new Contract.Default();}// 超时配置Beanpublic Request.Options options() {return new Request.Options(5000, 30000);}// 编解码器配置Jackson/*Beanpublic Encoder encoder() {return new JacksonEncoder();}Beanpublic Decoder decoder() {return new JacksonDecoder();}*/// 编解码器配置GsonBeanpublic Encoder encoder() {return new GsonEncoder();}Beanpublic Decoder decoder() {return new GsonDecoder();}// 拦截器配置Beanpublic MyFeignRequestInterceptor myFeignRequestInterceptor() {return new MyFeignRequestInterceptor();} }有效范围说明 全局生效(扫描到的所有服务)两种方式 1.在FeignConfig上加Configuration注解需要保证能扫描到2.在启动类的EnableFeignClients注解中配置defaultConfiguration EnableFeignClients(defaultConfiguration FeignConfig.class) 局部生效(指定服务)在接口API的FeignClient注解中配置 FeignClient(value demo-b, configuration FeignConfig.class)验证是否生效 这里直接到FeignClientFactoryBean.loadBalance方法的target生成动态代理之前打断点查看 Java Bean配置后的Feign.Builder 对于是全局还是局部有效我是确认过的因为不好演示所以大家有兴趣可以自行验证确认 补充说明1. 日志级别 Feign提供了4种日志级别 日志级别简单说明NONE默认值不记录日志BASIC记录请求方法、请求URL、响应状态代码、执行时间HEADERS在BASIC级别的基础上记录请求和响应的headerFULL记录全部日志请求和响应的header、body和metadata 注意 若要正常输出日志需要配置接口包路径的日志级别我这里是com.tiangang.demo.api所以 application.properties 配置 # 格式logging.level.{feign接口包路径}debug/info... logging.level.com.tiangang.demo.apidebug补充说明2. 契约contract 在OpenFeign下大部分情况下不需要配置contract但如果老项目已经定义了大量的feign注解那么就没必要再改成SpringMvc注解了直接改contract是个好办法 OpenFeign的默认contract是SpringMvcContract即支持SpringMvc注解。 如果修改为feign.Contract.Default测试时别忘了加feign注解否则会编译报错。 补充说明3. 编解码器 使用Jackson需要引入依赖 dependencygroupIdio.github.openfeign/groupIdartifactIdfeign-jackson/artifactId /dependency使用Gson需要引入依赖 dependencygroupIdio.github.openfeign/groupIdartifactIdfeign-gson/artifactId /dependencyGson的application.properties配置 feign.client.config.default.encoder feign.gson.GsonEncoder feign.client.config.default.decoder feign.gson.GsonDecoderFeign本身还提供了很多编解码器需要的话可以直接用如下图 当然了你也可以自定义编解码器 补充说明4. 拦截器 拦截器是 非常有用的扩展点是我们实现定制化需求的利器 当我们需要统一处理Header、处理请求参数、处理响应结果时就可以通过自定义拦截器处理。 Feign默认提供了Basic 认证拦截器我们可以直接配置使用 public class FeignConfig {Beanpublic BasicAuthRequestInterceptor basicAuthRequestInterceptor() {return new BasicAuthRequestInterceptor(userName, password);} }另外我们也可以自定义 只需要实现接口RequestInterceptor public interface RequestInterceptor {/*** Called for every request. Add data using methods on the supplied {link RequestTemplate}.*/void apply(RequestTemplate template); }例如上面的例子我自定义实现的拦截器如下 public class MyFeignRequestInterceptor implements RequestInterceptor {Overridepublic void apply(RequestTemplate template) {template.header(ACCESS_KEY, 9ZIpCT02u2ctppiXOzbpwBWMtRKPgxKe);} }例子的拦截器就是统一加了一个ACCESS_KEY的header当你的调用需要统一加header时就可以使用拦截器实现。当然不仅用于加header下面的GZIP压缩就是通过拦截器实现的 补充说明5. 配置Client 除了上面提到的通用配置方式外OpenFeign提供了专门的FeignAutoConfiguration里面包含对Client等的配置帮助我们快速配置Client。 在OpenFeign中默认的Client是JDK原生的URLConnection接下来我们就实战 快速配置 成 Apache HttpClient 和 OkHttp。 1). 配置Client为Apache HttpClient 引入依赖 !-- Apache HttpClient-- dependencygroupIdorg.apache.httpcomponents/groupIdartifactIdhttpclient/artifactId /dependency !-- Feign集成Apache HttpClient -- dependencygroupIdio.github.openfeign/groupIdartifactIdfeign-httpclient/artifactId /dependency配置文件中启用 application.properties feign.httpclient.enabledtrue参考源码 FeignAutoConfiguration.HttpClientFeignConfiguration 验证已经生效: 2). 配置Client为OkHttp 引入依赖 !-- okhttp -- dependencygroupIdcom.squareup.okhttp3/groupIdartifactIdokhttp/artifactId /dependency !-- Feign集成okhttp -- dependencygroupIdio.github.openfeign/groupIdartifactIdfeign-okhttp/artifactId /dependency配置文件中启用 application.properties feign.httpclient.enabledfalse feign.okhttp.enabledtrue参考源码 FeignAutoConfiguration.OkHttpFeignConfiguration 验证已经生效: 补充说明6. 配置GZIP压缩 在大数据量HTTP传输时开启压缩可以有效节约网络资源提升接口性能我们可以配置 GZIP 来压缩数据这也是OpenFeign通过自定义拦截器为我们实现的扩展功能。 application.properties # 请求数据压缩 feign.compression.request.enabledtrue # 压缩类型 feign.compression.request.mimeTypestext/xml,application/xml,application/json # 启用压缩的最小大小(默认是2048)这里为了测试配置成1 feign.compression.request.minRequestSize1 # 响应数据压缩 feign.compression.response.enabledtrue配置项参考源码 FeignClientEncodingProperties 压缩条件判断逻辑 请求 必须 有headerContent-Type 并且在配置的mimeTypes中请求 必须 有headerContent-Length并且大于配置的minRequestSize 我这里准备了一个POST请求请求json返回json日志级别我改为了FULL验证已经生效: 注意 只有当Feign的Client 不是 okhttp3.OkHttpClient 的时候压缩配置才会生效因为请求和响应的源码中有要求如下 参考源码 FeignContentGzipEncodingAutoConfiguration 参考源码FeignAcceptGzipEncodingAutoConfiguration 老方法我们也可以打断点看下GZIP压缩的拦截器 小结 配置项application.propertiesJava配置对象日志级别logLevelfeign.client.config.default.loggerLevel BASICBeanpublic Logger.Level feignLoggerLevel() { return Logger.Level.BASIC;}契约contractfeign.client.config.default.contract feign.Contract.DefaultBeanpublic Contract feignContract() { return new Contract.Default();}超时设置optionsfeign.client.config.default.connectTimeout 5000feign.client.config.default.readTimeout 30000Beanpublic Request.Options options() { return new Request.Options(5000, 30000);}编解码器encoderdecoderfeign.client.config.default.encoder feign.jackson.JacksonEncoderfeign.client.config.default.decoder feign.jackson.JacksonDecoderBeanpublic Encoder encoder() { return new JacksonEncoder();}Beanpublic Decoder decoder() { return new JacksonDecoder();}拦截器requestInterceptors#是数组可以按下标配置多个feign.client.config.default.requestInterceptors[0]com.tiangang.demo.api.interceptor.MyFeignRequestInterceptorBeanpublic MyFeignRequestInterceptor myFeignRequestInterceptor() { return new MyFeignRequestInterceptor();}Client#配置为ApacheHttpClient, 别忘了引入依赖feign.httpclient.enabledtrue#配置为OkHttp, 别忘了引入依赖feign.httpclient.enabledfalsefeign.okhttp.enabledtrueGZIP压缩#当Feign的Client 不是 okhttp3.OkHttpClient 的时生效。# 请求数据压缩feign.compression.request.enabledtrue# 压缩类型feign.compression.request.mimeTypestext/xml,application/xml,application/json# 启用压缩的最小大小(默认是2048)feign.compression.request.minRequestSize2048# 响应数据压缩feign.compression.response.enabledtrue三、源码解读 请思考如果让你来开发设计你会在哪里做扩展点配置 我们先跟进下 注册流程看看能不能找出扩展点配置是在哪里配置的 1. 注册流程 回顾上文OpenFeign的实战三步走 引入依赖spring-cloud-starter-openfeign定义远程API接口加FeignClient注解启动类加EnableFeignClients注解 通过这三步走我们可以断定OpenFeign的核心实现肯定和EnableFeignClients注解有关因为没有其它入口了这也是SpringBoot整合的惯用套路所以我们快速跟踪一下主线流程看它是如何将接口API生成的动态代理类 FeignClientsRegistrar 在EnableFeignClients上有Import(FeignClientsRegistrar.class)注解 FeignClientsRegistrar重写的registerBeanDefinitions方法里会扫描所有FeignClient的接口并将所有接口注册为FeignClientFactoryBean。 FeignClientFactoryBean FeignClientFactoryBean重写getObject方法先通过feign方法获取到Feign.Builder再根据FeignClient.url决定是否走负载均衡loadBalance不管怎么走最终都会调用Feign.Builder.target方法生成动态代理对象。 2. 扩展点配置主逻辑 OK根据注册流程主线已经很清晰了获取到Feign.Builder的地方正是我们扩展点配置的好地方实际也确实在这里如下图 configureFeign方法: 红框处就是扩展点配置的主逻辑如果以application.properties为默认defaultToPropertiestrue默认也是true一般也不会改 1.配置Java Bean 2.配置properties的default配置全局 3.配置properties的当前服务配置局部 否则else就反过来后配置的优先级自然更高 3. 配置文件源头 主逻辑中的FeignClientPropertiesproperties 就是application.properties配置文件项的源头带有ConfigurationProperties注解如下图 从这里就可以看出具体每项配置是Map类型的config它的key服务名valueFeignClientConfiguration 所以在application.properties里配置均为feign.client.config.{服务名}.{配置名}{配置值} 如果 {服务名} default即默认对所有服务有效否则仅对配置服务有效 FeignClientConfiguration中全部可配置的属性如下图 4. Java Bean配置源头 Java Bean配置主要在主逻辑的configureUsingConfiguration方法另外在构建builder时也算一处一共有两处优先级由低到高 FeignClientFactoryBean.feign方法 - 构建 这里配置必备Bean下图这5个都有在FeignClientsConfiguration里配置缺省Bean当然如果你在指定的FeignConfig中加了自定义Bean就会以你配置的为准 FeignClientFactoryBean.configureUsingConfiguration方法 - 配置 主要在这里配置可选Bean就是下图这些 builder. 设置的当然如果你在指定的FeignConfig中加了自定义Bean就会以你配置的为准 最后 通过本文我们对OpenFeign的扩展点配置进行了实战并对源码进行了详细解读如果你在项目中使用到了OpenFeign相信这些扩展功能会让你在项目中使用得心应手。 另外需要说明OpenFeign不仅可以用于微服务之间的调用还可以用于调用第三方服务所以应用非常广泛 至此OpenFeign的神秘面纱就被我们完全揭开了 那么接下来在Spring Cloud Alibaba家族中还有一位主打高性能RPC调用的组件就是由阿里巴巴公司开源的后捐献给Apache 基金会的Dubbo那么它到底有什么过人之处会让很多公司从Feign转到Dubbo调用这也是我计划将在下文分享的内容如果感觉不错欢迎订阅本专栏后面还有更多的【Spring Cloud Alibaba】实战知识陆续放出。 关注我 天罡gg 分享更多干货 https://blog.csdn.net/scm_2008 大家的「关注❤️ 点赞 收藏⭐」就是我创作的最大动力谢谢大家的支持我们下文见
http://www.hkea.cn/news/14542891/

相关文章:

  • 青岛网站推广怎么选店面设计图纸
  • 成都网站建设scdzks浅谈网站建设的目的和意义
  • 图书销售网站网页设计模板安徽城乡建设厅网站焊工证查询
  • 深圳市建设行业主管部门官方网站跨境电商seo什么意思
  • 西安网站建设资讯网页设计有限公司
  • seo大神做的网站wordpress获取手机号
  • 网站开发 运行及维护制作人是做什么的
  • 阿里云官方网站 icp代备案管理系统wordpress pdf 预览
  • 深圳做微信商城网站服装设计投稿平台有哪些
  • 零食网站建设描述书昆明网络营销公司哪家比较好
  • 网站的ci设计怎么做wordpress th7
  • 做网站的咋挣钱网易和暴雪
  • 毕业设计商城网站开发胡芦娃app软件下载网站
  • wordpress制作分销网站盐城市建设局网站物业资质
  • 广州网站建设484186ui设计流程培训网站
  • 网站搭建交流群征求网站建设意见的通知
  • wordpress分享视频网站水碓子网站建设
  • 做书封面的网站最佳外贸建站平台
  • 官方网站建设建议WordPress 媒体库缩略图
  • 泾阳做网站容桂网站制作动态
  • 网站开发 工作职责北京网站排名seo
  • 线上咨询预约网站建设方案渭南软件开发
  • pc三合一网站郑州网站建设哪家公司便宜
  • 自己做网站好做吗软考考试科目有哪些
  • wordpress新建文章页修改图片样式网络推广seo公司
  • 做社区网站用什么程序深圳市做网站的有那些公司
  • 网站 建设 初期规划网上卖货的平台有哪些
  • 网站推广的定义及方法微信社群运营主要是做什么的
  • 360网站建设服务器做电商网站搭建晋升
  • 福州品牌网站建设oem深圳股票配资网站开发