IT教程 ·

java架构之路-(微服务专题)feign的基本使用和nacos的设置中央

3D点云配准算法简述

上次回归:

上次我们说了ribbon的基本运用,包含内里的内部算法,算法的细粒度设置,另有我们本身怎样完成我们本身的算法,重要照样一些基本运用的学问,还不会运用ribbon的小伙伴能够归去看一下上一篇博客。

什么是Feign:

  Feign是Netflix开发的声明式、模板化的HTTP客户端,其灵感来自Retrofit、JAXRS­2.0以及WebSocket。Feign 可协助我们越发便利、文雅地挪用HTTP API,为何我们会挑选运用Feign呢?我们上次说到的ribbon也是能够挪用长途API的啊,然则你的要求地点参数许多呢?比方如许https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=%E5%B0%8F%E8%8F%9C%E6%8A%80%E6%9C%AF&rsv_pq=c848f94a0022633c&rsv_t=82132w5e6o2pWnrOzzEl1kRwfItDYCuNU7FotoIqlCHTCjD2WiDKjarInW8&rqlang=cn&rsv_enter=1&rsv_dl=tb&rsv_sug3=13&rsv_sug1=1&rsv_sug7=100&rsv_sug2=0&inputT=1408&rsv_sug4=1408,而且参数还老是变化的(客户天天都在变需求),你每次都须要改写代码,地点太长还轻易写错,是不是是以为写起来很费劲的模样,我们此次进修的Feign就是来处理这个问题的。

Feign的经常使用设置详解:

适才我们简朴的说到了Feign是做什么的,我们来看一下,我们怎样运用Feign吧。照样我们的两个效劳,一个用户效劳,一个定单效劳,我们离别来看一下设置。

一、最简朴的启动

①.起首到场父依靠包,在启动类到场注解@EnableFeignClients

<!-- 到场Feign依靠-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
package com.xiaocaiFeign;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

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

}

②.竖立我们的定单效劳,竖立一个接口,接口以下,须要加注解@FeignClient(name = "feign-order"),完成类你们本身去完成吧

package com.xiaocaiFeign.controller;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

@FeignClient(name = "feign-order")
public interface OrderController {

    @RequestMapping("/getOrderData/{orderId}")
    String getOrderData(@PathVariable("orderId") String orderId);
}

③.修正我们的定单效劳的POM文件,弄成一个jar包即可,不须要可执行的jar包。

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
        </plugin>
    </plugins>
</build>

④.竖立我们的用户效劳,将我们的定单效劳以jar包的情势引入进来。

<dependencies>
    <dependency>
        <groupId>com</groupId>
        <artifactId>feignOrder</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
</dependencies>

这里万万注重一个问题,你的定单效劳和你的用户效劳,包途径一定要雷同,不然springboot是扫描不到你的包的,牢记~!!!

java架构之路-(微服务专题)feign的基本使用和nacos的设置中央 IT教程 第1张

⑤.编写我们的挪用类(用户效劳)

package com.xiaocaiFeign.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    @Autowired
    private OrderController orderController;

    @GetMapping("/getOrder")
    public String getOrderData() {
        System.out.println("预备挪用");
        String orderData = orderController.getOrderData("1");
        System.out.println(orderData);
        return orderData;
    }
}

运转看结果

java架构之路-(微服务专题)feign的基本使用和nacos的设置中央 IT教程 第2张

是不是是超等简朴。

二、打印日记级别

起首我们在定单效劳到场一个设置,万万别写@Configuration

package com.xiaocaiFeign.config;

import feign.Logger;
import org.springframework.context.annotation.Bean;

public class FeignLogConfig {

    @Bean
    public Logger.Level level() {
        //return Logger.Level.NONE; //(默许)不打印任何日记
        return Logger.Level.BASIC;//仅纪录要求要领、URL、相应状况代码以及执行时候,生成平常用这个
        //return Logger.Level.HEADERS;//在BASIC基本之上还纪录了要乞降相应的header.
        //return Logger.Level.FULL;//纪录了要乞降相应的header、body和元数据
    }
}

然后在我们的接口类下面赋予这个设置

package com.xiaocaiFeign.controller;

import com.xiaocaiFeign.config.FeignLogConfig;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

@FeignClient(name = "feign-order", configuration = FeignLogConfig.class)
public interface OrderController {

    @RequestMapping("/getOrderData/{orderId}")
    String getOrderData(@PathVariable("orderId") String orderId);

}

末了我们在我们的用户效劳中开启设置,注重xiaocaiFeign是你的包名。

logging:
  level:
    com:
      xiaocaiFeign: debug

我们来看一下结果,我这只演示一下FULL的吧~!

java架构之路-(微服务专题)feign的基本使用和nacos的设置中央 IT教程 第3张

  三、分外我以为没用的设置,左券设置

  横竖我是以为没啥大用,而且还不熟习的,和我们的日记差不多,到场一个自定义的设置类

package com.xiaocaiFeign.config;

import feign.Contract;
import org.springframework.context.annotation.Bean;


public class MyFeignConfig {
    /**
     * 依据SpringBoot自动装配FeignClientsConfiguration 的FeignClient的左券是SpringMvc
     * 经由过程修正左券为默许的Feign的锲约,那末就能够运用默许的注解
     * @return
     */
    @Bean
    public Contract feiContract() {
        return new Contract.Default();
    }
}

然后经由过程接口引入,然则这回接口必需要写feign的注解了,我以为没这个必要,我照样比较习习用springMVC的注解。

package com.xiaocaiFeign.controller;

import com.xiaocaiFeign.config.MyFeignConfig;
import feign.Param;
import feign.RequestLine;
import org.springframework.cloud.openfeign.FeignClient;

@FeignClient(name = "feign-order", configuration = MyFeignConfig.class)
public interface OrderController {

    @RequestLine("GET /getOrderData/{orderId}")
    String getOrderData(@Param("orderId") String orderId);
}

这写就能够挪用了,内里都别写错了,写错了,用户效劳可能会启动失利的。

四、要求头通报

末了一个实例了,如果我们如许的,用户效劳挪用定单效劳,定单效劳每次挪用须要照顾要求头token举行考证,我们又该怎样来做呢?我们来看一下代码完成,先弄一个拦截器。

package com.xiaocaiFeign.config;

import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;

public class MyRequestInterceptor implements RequestInterceptor {

    @Override
    public void apply(RequestTemplate template) {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        template.header("token", request.getHeader("token"));
    }
}

然后将拦截器设置到Feign下面去。

package com.xiaocaiFeign.controller;

import com.xiaocaiFeign.config.FeignLogConfig;
import com.xiaocaiFeign.config.MyFeignConfig;
import com.xiaocaiFeign.config.MyRequestInterceptor;
import feign.Param;
import feign.RequestLine;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

@FeignClient(name = "feign-order",configuration = MyRequestInterceptor.class) public interface OrderController {

    @RequestMapping("/getOrderData/{orderId}")
    String getOrderData(@PathVariable("orderId") String orderId);

//    @RequestLine("GET /getOrderData/{orderId}")
//    String getOrderData(@Param("orderId") String orderId);

    @RequestMapping("/getOrderToken")
    String getOrderToken();
}

本身去测试一下挪用结果吧,我弄这个弄了良久,保证没问题的,我就不上图了。

Feign的优化设置:

我们的Feign底层照样运用Ribbon来挪用的,第一次许多时刻会挪用的慢,我能够改成HTTPClient挪用体式格局。

feign:
  client:
    config:
      connectTimeout: 5000 #衔接超时时候(毫秒)
      readTimeout: 5000 # 读取超时时候(毫秒)
      product-center:
        loggerLevel: full # 日记级别
        contract: feign.Contract.Default #指定默许左券
  httpclient:
    enabled: true # 开启httpClient
    max-connections: 200 # 最大衔接数
    max-connections-per-route: 50 # 为每一个url要求设置最大衔接数

nacos设置中间详解:

nacos内里另有一个设置中间还没有去说,我们如今的项目许多都是微效劳的,也晓得微效劳会拆分红许多个小的效劳,到场你拆分的不多,10个效劳,当地开发环境,大众开发环境,测试环境,生产环境,那末你就意味着你须要弄40个设置文件,而且你会暴露你的数据库地点给开发,那末我们此次就用nacos来看看设置中间是怎样做的吧。我们先弄一个最简朴的测试类。

package com.nacosConfig.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ConfigCenterController {

    @Value("${config.center.name}")
    private String name;

    @GetMapping("/")
    public String getData() {
        System.out.println(name);
        return name;
    }
}
server:
  port: 8080

config:
  center:
    name: "张三"

先不必nacos设置中间,我们来测试一下。

java架构之路-(微服务专题)feign的基本使用和nacos的设置中央 IT教程 第4张

我们来看一下nacos是怎样来设置的

①.到场依靠包。

<!-- 引入nacos设置依靠-->
<dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-alibaba-nacos-config</artifactId>
</dependency>

②.新建一个叫做bootstrap.yml的设置,这个设置会优先于springboot自带的application.yml设置。

spring:
  application:
    name: nacos 
  profiles:
    active: config
  cloud:
    nacos:
      config:
        server-addr: 192.168.138.119:8848
        namespace: 83cbe7a9-7713-4d5c-b052-a42ba1df9e84
        file-extension: yml

来解释一下我们的设置,第一个spring.application.name=nacos是我们的文件名字,spring.profiles.active=config照样我们的文件名字,spring.cloud.nacos.config.file-extension=yml是文件后缀,就是说,我们会去拿名字为nacos-config.yml这个文件。衔接和敕令空间这里就不说了,在nacos的注册中间讲的已很详细了。

③.登录nacos页面,点击设置列表,挑选对应的定名空间,点击“+”举行新增。

java架构之路-(微服务专题)feign的基本使用和nacos的设置中央 IT教程 第5张

java架构之路-(微服务专题)feign的基本使用和nacos的设置中央 IT教程 第6张

就如许,一个简朴的设置中间就完成了(启动会报错,是因为你的注册中间没有注册胜利报错的)。而且还能够检察汗青版本,用起来照样不错的,你能够在application.yml写入你的注册设置,以下所示

spring:
  application:
    name: nacos-config
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.138.119:8848

这时候项目启动的时刻会自动拉取nacos-config.yml设置文件。如许写是什么意义呢?就是你一个shoppingServer,你有差别的环境,我们写一个通用的设置shoppingServer.yml,然后经由过程你的shoppingServer-dev.yml、shoppingServer-st.yml,等文件来细化我们的差别环境的设置。

另有一个设置是如许的。

spring:
  application:
    name: nacos-config
  profiles:
    active: dev
  cloud:
    nacos:
      config:
        server-addr: 192.168.138.119:8848
        file-extension: yml
 shared-dataids: config1.yml,config2.yml

就是说我们另有加载config1.yml和config2.yml设置文件。如今我们说到四个设置文件了,那末他们的次序又是什么呢?config1.yml<<<config2.yml<<<nacos-config.yml<<<nacos-config-dev.yml,越是在背面加载的,权益越大,就是背面的设置能够覆盖掉前面的设置。这里的shared-dataids: config1.yml,config2.yml平常用于差别体系中的通用设置,比方我们在用户体系和定单体系有通用设置,我们能够经由过程shared-dataids的体式格局来引入设置。

还能够如许来写

spring:
  application:
    name: nacos-config
  profiles:
    active: dev
  cloud:
    nacos:
      config:
        server-addr: 192.168.138.119:8848
        file-extension: yml
        shared-dataids: config1.yml,config2.yml
        refreshable-dataids: config1.yml,config2.yml
        ext-config:
          - data-id: config3.yml
            group: DEFAULT_GROUP
            refresh: true
          - data-id: config4.yml
            group: DEFAULT_GROUP
            refresh: true

这回又多了一些文件,次序是什么模样的呢?我再来写一下config1.yml<<<config2.yml<<<config3.yml<<<config4.yml<<<nacos-config.yml<<<nacos-config-dev.yml。

spring:
  application:
    name: nacos-config
  profiles:
    active: dev
  cloud:
    refresh:
 enabled: true # 默许是true
    nacos:
      config:
        server-addr: 192.168.138.119:8848
        file-extension: yml
        shared-dataids: config1.yml,config2.yml
 refreshable-dataids: config1.yml,config2.yml
        ext-config:
          - data-id: config3.yml
            group: DEFAULT_GROUP
 refresh: true
          - data-id: config4.yml
            group: DEFAULT_GROUP
   refresh: false

其中标红的谁人几个值是掌握是不是能够动态革新的,就是说我们改了设置中间的设置,不必重启效劳,设置就能够见效的,须要在类上面到场@RefreshScope注解。

末了一个问题,nacos改暗码和增加账户,我们集群的时刻衔接一个mysql数据库对吧,单机的比较头疼,我们设置单机的内部是用一个Derby这个数据库来衔接的,我这里只能用IDEA改当地的Derby然后拷贝到linux上去,临时没啥别的好办法,用页面也能改,然则没法增加用户,而我们的集群是用的mysql,我们能够本身操纵啦,来一个增加用户的操纵,翻开我们的mysql的nacos库,找到users表,增加用户,然后我们用下面的要领来手动生成暗码。

<dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-security</artifactId>
        <version>1.2.2.RELEASE</version>
</dependency>
public static void main(String[] args) {
    String nacos = new BCryptPasswordEncoder().encode("nacos");
    System.out.println("nacos = " + nacos);
}

然后把我们的暗码本身弄到mysql数据库内就能够啦

总结:

  此次重要说了feign的基本运用,日记级别的挑选,另有我们的要求头怎样通报,然后就是我们的Nacos的设置中间是怎样去做的,我们设置文件的加载次序,末了是我们的nacos怎样增加用户和修正暗码(页面就能够改)。

 java架构之路-(微服务专题)feign的基本使用和nacos的设置中央 IT教程 第7张java架构之路-(微服务专题)feign的基本使用和nacos的设置中央 IT教程 第8张

Java 添加、读取、删除Excel文档属性

参与评论