欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringCloud超詳細(xì)講解Feign聲明式服務(wù)調(diào)用

 更新時(shí)間:2022年06月21日 09:37:29   作者:墨鴉_Cormorant  
Feign可以把Rest的請(qǐng)求進(jìn)行隱藏,偽裝成類似Spring?MVC的Controller一樣。不用再自己拼接url,拼接參數(shù)等等操作,一切都交給Feign去做

入門案例

在服務(wù)消費(fèi)者導(dǎo)入依賴

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

在啟動(dòng)類上添加@EnableFeignClients注解

Feign中已經(jīng)自動(dòng)集成了Ribbon負(fù)載均衡,因此不需要自己定義RestTemplate

@SpringCloudApplication
@EnableFeignClients		// 開啟Feign注解
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }
}

編寫Feign客戶端

@FeignClient(value = "user-service")    // 添加FeignClient,指定服務(wù)ID
public interface UserClient {
    /**
     * 聲明一個(gè)feign的接口,它的實(shí)現(xiàn)是服務(wù)提供者的controller實(shí)現(xiàn)
     */
    @GetMapping("/user/{id}")
    User getById(@PathVariable("id") Long id);
}

代碼中調(diào)用,使用userClient訪問:

@Autowired  // 注入U(xiǎn)serClient
private UserClient userClient;
public User getUserById(@PathVariable long id) {
    User user = userClient.getById(id);
    return user;
}

@FeignClient注解詳解

@FeignClient注解只能在Interface接口上使用。Feign會(huì)通過動(dòng)態(tài)代理,生成實(shí)現(xiàn)類。

FeignClient注解被@Target(ElementType.TYPE)修飾,表示FeignClient注解的作用目標(biāo)在接口上

@FeignClient ,聲明這是一個(gè)Feign客戶端,同時(shí)通過 name / value 屬性指定服務(wù)名稱

接口中定義的方法,完全采用SpringMVC的注解,F(xiàn)eign會(huì)根據(jù)注解生成URL,并訪問獲取結(jié)果

服務(wù)的啟動(dòng)類要有@EnableFeignClients 注解才能使Fegin生效

@FeignClient注解的常用屬性如下:

name / value:指定FeignClient的名稱,如果項(xiàng)目使用了Ribbon(注冊(cè)中心),name屬性會(huì)作為微服務(wù)的名稱,用于服務(wù)發(fā)現(xiàn)

url:一般用于調(diào)試,可以手動(dòng)指定@FeignClient調(diào)用的地址。默認(rèn)為空

url可以從配置文件獲取,如果有則通過url調(diào)用,沒有則根據(jù)服務(wù)名調(diào)用。格式為 url = "${xxx.xxx.xxx: }"

configuration:Feign配置類,可以自定義Feign的Encoder、Decoder、LogLevel、Contract,可以為每一個(gè)feign client指定不同的配置

fallback:定義容錯(cuò)的處理類,當(dāng)調(diào)用遠(yuǎn)程接口失敗或超時(shí)時(shí),會(huì)調(diào)用對(duì)應(yīng)接口的容錯(cuò)邏輯,fallback指定的類必須實(shí)現(xiàn)@FeignClient標(biāo)記的接口

fallbackFactory:工廠類,用于生成fallback類示例,通過這個(gè)屬性可以實(shí)現(xiàn)每個(gè)接口通用的容錯(cuò)邏輯,減少重復(fù)的代碼

path:定義當(dāng)前FeignClient的統(tǒng)一前綴,當(dāng)項(xiàng)目中配置了server.context-path, server.servlet-path時(shí)使用

decode404:當(dāng)發(fā)生http 404錯(cuò)誤時(shí),如果該字段位true,會(huì)調(diào)用decoder進(jìn)行解碼,否則拋出FeignException

調(diào)用方式:

方式一:接口提供方在注冊(cè)中心

如果服務(wù)提供方已經(jīng)注冊(cè)到注冊(cè)中心了,那么name或者value的值為:服務(wù)提供方的服務(wù)名稱。必須為所有客戶端指定一個(gè)name或者value

@FeignClient(value="run-product",fallback = ProductClientServiceFallBack.class)

方式二:?jiǎn)为?dú)的一個(gè)http接口,接口提供方?jīng)]有注冊(cè)到注冊(cè)中心

@FeignClient(name="runClient11111",url="localhost:8001")

此處name的值為:調(diào)用客戶端的名稱

以上兩種方式都能正常調(diào)用。name可以為注冊(cè)中心的服務(wù)名稱,加上url屬性時(shí),name的值就與注冊(cè)中心服務(wù)名稱無關(guān)。

Feign Client的配置

feign配置是在ribbon配置的基礎(chǔ)上做了擴(kuò)展,可以支持服務(wù)級(jí)超時(shí)時(shí)間配置,所以,feign配置和ribbon配置的效果是?樣的。

SpringCloud對(duì)配置的優(yōu)先級(jí)順序如下:

  • Feign局部配置 > Feign全局配置 > Ribbon局部配置 > Ribbon全局配置
  • 配置文件屬性和配置類的優(yōu)先級(jí)順序?yàn)椋号渲梦募傩耘渲?> 配置類代碼配置

feign:
  client:
    config:
      default:    # 全部服務(wù)配置
        connectTimeout: 5000    # 建立連接的超時(shí)時(shí)長(zhǎng),單位:毫秒。默認(rèn)為1000
        readTimeout: 5000        # 指建立連接后從服務(wù)端讀取到可用資源所用的超時(shí)時(shí)間,單位:毫秒。默認(rèn)為1000
        loggerLevel: FULL        # 日志級(jí)別
        errorDecoder: com.example.SimpleErrorDecoder  # Feign的錯(cuò)誤解碼器,相當(dāng)于代碼配置方式中的ErrorDecoder
        retryer: com.example.SimpleRetryer  # 配置重試,相當(dāng)于代碼配置方式中的Retryer
        requestInterceptors: # 配置攔截器,相當(dāng)于代碼配置方式中的RequestInterceptor
          - com.example.FooRequestInterceptor
          - com.example.BarRequestInterceptor
        decode404: false    # 是否對(duì)404錯(cuò)誤解碼
        encode: com.example.SimpleEncoder
        decoder: com.example.SimpleDecoder
        contract: com.example.SimpleContract
      serverName:    # 單獨(dú)給某?服務(wù)配置。serverName是服務(wù)名,使?的時(shí)候要?服務(wù)名替換掉這個(gè)
        connectTimeout: 5000
        readTimeout: 5000

Feign請(qǐng)求添加headers

方案一:方法上的@RequestMapping注解添加headers信息

@RequestMapping注解的屬性中包含一個(gè)headers數(shù)組,可以在指定的方法上@RequestMapping注解中添加需要的headers,可以是寫死的,也可以讀取配置=

同理@RequestMapping一組的@PostMapping,@GetMapping注解等均適用

@FeignClient(name = "server",url = "127.0.0.1:8080")
public interface FeignTest {
    @RequestMapping(value = "/test",headers = {"app=test-app","token=${test-app.token}"})
    String test();
}

方案二:接口上的@RequestMapping注解添加headers信息

如果同一個(gè)接口中所有的方法都需要同樣的headers,可以在接口上的@RequestMapping注解中添加headers,使整個(gè)接口的方法均被添加同樣的headers

@FeignClient(name = "server",url = "127.0.0.1:8080")
@RequestMapping(value = "/",headers = {"app=test-app","token=${test-app.token}"})
public interface FeignTest {
    @RequestMapping(value = "/test")
    String test();
}

方案三:使用@Headers注解添加headers信息(不推薦)

@FeignClient(name = "server",url = "127.0.0.1:8080")
@Headers({"app: test-app","token: ${test-app.token}"})
public interface FeignTest {
    @RequestMapping(value = "/test")
    String test();
}

查看openfeign官方文檔發(fā)現(xiàn)其使用的是@Headers來添加headers,測(cè)試發(fā)現(xiàn)并沒有生效,spring cloud使用了自己的SpringMvcContract來解析注解,所以需要自己實(shí)現(xiàn)一個(gè)Contract來實(shí)現(xiàn)對(duì)@Headers注解的支持,具體實(shí)現(xiàn)參照(http://www.dbjr.com.cn/article/252325.htm

方案四:自定義RequestInterceptor添加headers信息

feign提供了一個(gè)攔截器接口RequestInterceptor,實(shí)現(xiàn)RequestInterceptor接口就可以實(shí)現(xiàn)對(duì)feign請(qǐng)求的攔截,接口提供了一個(gè)方法apply(),實(shí)現(xiàn)apply()方法

實(shí)現(xiàn)apply()方法直接添加header會(huì)攔截所有的請(qǐng)求都加上headers,如果不是所有的feign請(qǐng)求都需要用到不建議此方法

@Component
public class FeignRequestInterceptor implements RequestInterceptor {
    @Value("${test-app.token}")
    private String token;
    @Override
    public void apply(RequestTemplate requestTemplate) {
        requestTemplate.header("app","test-app");//靜態(tài)
        requestTemplate.header("token",token);//讀配置
    }
}

方案五:自定義RequestInterceptor實(shí)現(xiàn)添加動(dòng)態(tài)數(shù)據(jù)到header

以上方案都不適合把動(dòng)態(tài)的數(shù)據(jù)放入headers中,而通常場(chǎng)景下可能經(jīng)常需要把計(jì)算的簽名,用戶id等動(dòng)態(tài)信息設(shè)置到headers,所以還需要一個(gè)更加完善的方案。方案1/2/3均不能設(shè)置動(dòng)態(tài)的值,方案4可以設(shè)置動(dòng)態(tài)值,但是沒做到請(qǐng)求的區(qū)分,所以在方案4的基礎(chǔ)上進(jìn)行改進(jìn)得到了較為完善的方案5。具體實(shí)現(xiàn)如下:

在請(qǐng)求調(diào)用代碼中,獲取到HttpServletRequest對(duì)象,將需要添加到headers中的值封裝成一個(gè)map后放入HttpServletRequest的attribute域中

    ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
    HttpServletRequest request = Objects.requireNonNull(attributes).getRequest();
    String signedMsg = getSignedMsg(reqJson); 		// 計(jì)算簽名字符串
    Map<String, String> reqMap = new HashMap<>();
    reqMap.put("content-type", "application/json");	//常量字段
    reqMap.put("accessKey", accessKey);		//常量字段
    reqMap.put("signedMsg", signedMsg);		//動(dòng)態(tài)計(jì)算/獲取字段
    request.setAttribute("customizedRequestHeader", reqMap);

在自定義RequestInterceptor中獲取到HttpServletRequest對(duì)象的attribute域中指定的key,將key對(duì)應(yīng)map中的所有參數(shù)加入到headers。

@Component
public class FeignRequestInterceptor implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate requestTemplate) {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        // 設(shè)置自定義header
        // 設(shè)置request中的attribute到header以便轉(zhuǎn)發(fā)到Feign調(diào)用的服務(wù)
        Enumeration<String> reqAttrbuteNames = request.getAttributeNames();
        if (reqAttrbuteNames != null) {
            while (reqAttrbuteNames.hasMoreElements()) {
                String attrName = reqAttrbuteNames.nextElement();
                if (!"customizedRequestHeader".equalsIgnoreCase(attrName)) {
                    continue;
                }
                Map<String,String> requestHeaderMap = (Map)request.getAttribute(attrName);
                for (Map.Entry<String, String> entry : requestHeaderMap.entrySet()) {
                    requestTemplate.header(entry.getKey(), entry.getValue());
                }
                break;
            }
        }
    }
}

負(fù)載均衡 (Ribbon)

Feign中本身已經(jīng)集成了Ribbon依賴和自動(dòng)配置,默認(rèn)支持Ribbon。

Fegin內(nèi)置的ribbon默認(rèn)設(shè)置了請(qǐng)求超時(shí)時(shí)長(zhǎng),默認(rèn)是1000ms。因?yàn)镽ibbon內(nèi)部有重試機(jī)制,一旦超時(shí),會(huì)自動(dòng)重新發(fā)起請(qǐng)求

可以通過配置來修改:

全局配置 使用 ribbon.=

ribbon:
  ReadTimeout: 2500     # 數(shù)據(jù)通信超時(shí)時(shí)長(zhǎng),單位:ms。默認(rèn)為1000
  ConnectTimeout: 500     # 連接超時(shí)時(shí)長(zhǎng),單位:ms。默認(rèn)為1000
  OkToRetryOnAllOperations: false     # 是否對(duì)所有的異常請(qǐng)求(連接異常和請(qǐng)求異常)都重試。默認(rèn)為false
  MaxAutoRetriesNextServer: 1         # 最多重試多少次連接服務(wù)(實(shí)例)。默認(rèn)為1。不包括首次調(diào)用
  MaxAutoRetries: 0     # 服務(wù)的單個(gè)實(shí)例的重試次數(shù)。默認(rèn)為0。不包括首次調(diào)用
  NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule    # 切換負(fù)載均衡策略為隨機(jī)

指定服務(wù)配置 <服務(wù)名稱>.ribbon. =

serverName:    # 單獨(dú)給某?服務(wù)配置。serverName是服務(wù)名,使?的時(shí)候要?服務(wù)名替換掉這個(gè)
  ribbon:
    connectTimeout: 5000
    readTimeout: 5000

容錯(cuò)機(jī)制

Hystrix支持

Feign默認(rèn)也有對(duì)Hystix的集成,只不過,默認(rèn)情況下是關(guān)閉的。需要通過下面的參數(shù)來開啟:

feign:
  hystrix:
    enabled: true    # 開啟hystrix熔斷機(jī)制
hystrix:
  command:
    default:    # 全局默認(rèn)配置
      execution:    # 線程隔離相關(guān)
        timeout:
          enabled: true        # 是否給方法執(zhí)行設(shè)置超時(shí)時(shí)間,默認(rèn)為true。一般不改。
        isolation:
          strategy: THREAD    # 配置請(qǐng)求隔離的方式,這里是默認(rèn)的線程池方式。還有一種信號(hào)量的方式semaphore,
          thread:
            timeoutlnMilliseconds: 10000    # 方式執(zhí)行的超時(shí)時(shí)間,默認(rèn)為1000毫秒,在實(shí)際場(chǎng)景中需要根據(jù)情況設(shè)置
      circuitBreaker:    # 服務(wù)熔斷相關(guān)
        requestVolumeThreshold: 10            # 觸發(fā)熔斷的最小請(qǐng)求次數(shù),默認(rèn)20
        sleepWindowInMilliseconds: 10000    # 休眠時(shí)長(zhǎng),單位毫秒,默認(rèn)是5000毫秒
        errorThresholdPercentage: 50        # 觸發(fā)熔斷的失敗請(qǐng)求最小占比,默認(rèn)50%
    serverName:    # 單獨(dú)給某?服務(wù)配置
      execution:
        timeout:
          enabled: true
        isolation:
          strategy: THREAD
          thread:
            timeoutlnMilliseconds: 10000

注意:

Hystix的超時(shí)時(shí)間應(yīng)該比Ribbon重試的總時(shí)間要大 ,否則Hystrix命令超時(shí)后,該命令直接熔斷,重試機(jī)制就沒有任何意義了。

Ribbon:總重試次數(shù) = 訪問的服務(wù)器數(shù) * 單臺(tái)服務(wù)器最大重試次數(shù)

即 總重試次數(shù) = (1+MaxAutoRetriesNextServer)*(1+MaxAutoRetries )

Hystrix超時(shí)時(shí)間 > (Ribbon超時(shí)時(shí)間總和)* 重試次數(shù)

故 建議hystrix的超時(shí)時(shí)間為:

( ( 1+MaxAutoRetriesNextServer) * (1+MaxAutoRetries ) ) * (ReadTimeout + connectTimeout)

  • MaxAutoRetries:Ribbon配置: 服務(wù)的單個(gè)實(shí)例的重試次數(shù)。不包括首次調(diào)用
  • MaxAutoRetriesNextServer:Ribbon配置: 最多重試多少次連接服務(wù)(實(shí)例)。不包括首次調(diào)用
  • ReadTimeout:Ribbon配置: 通信超時(shí)時(shí)間
  • connectTimeout:Ribbon配置: 建立連接超時(shí)時(shí)間

Sentinel支持

Sentinel 可以通過并發(fā)線程數(shù)模式的流量控制來提供信號(hào)量隔離的功能。并且結(jié)合基于響應(yīng)時(shí)間的熔斷降級(jí)模式,可以在不穩(wěn)定資源的平均響應(yīng)時(shí)間比較高的時(shí)候自動(dòng)降級(jí),防止過多的慢調(diào)用占滿并發(fā)數(shù),影響整個(gè)系統(tǒng)。

依賴

        <!--Sentinel-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>

在配置文件中開啟Feign對(duì)Sentinel的支持

feign:
  sentinel:
    enabled: true

Feign開啟容錯(cuò)機(jī)制支持后的使用方式

Feign 開啟 Hystrix 或 Sentinel 容錯(cuò)機(jī)制支持后的使用方式均是如下兩種:

方案一:直接繼承被容錯(cuò)的接口,并為每個(gè)方法實(shí)現(xiàn)容錯(cuò)方案

方案二:實(shí)現(xiàn)FallbackFactory接口

方案一:直接繼承被容錯(cuò)的接口,并為每個(gè)方法實(shí)現(xiàn)容錯(cuò)方案

定義一個(gè)類,作為fallback的處理類 。直接繼承被容錯(cuò)的接口,并為每個(gè)方法實(shí)現(xiàn)容錯(cuò)方案

@Component
public class UserClientFallback implements UserClient {
    @Override
    public User getById(Long id) {
        return new User(1L, "我是備份-feign", 18, new Date());
    }
}

在 @FeignClient 注解中使用 fallback 屬性指定自定義的容錯(cuò)處理類

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

測(cè)試驗(yàn)證

方案二:實(shí)現(xiàn)FallbackFactory接口??梢阅玫骄唧w的服務(wù)錯(cuò)誤信息,便于后期排查問題

@FeignClient(value="34-SPRINGCLOUD-SERVICE-GOODS", fallbackFactory = GoodsRemoteClientFallBackFactory.class)
public interface GoodsRemoteClient {
    @RequestMapping("/service/goods")
    public ResultObject goods();
}
@Component
public class GoodsRemoteClientFallBackFactory implements FallbackFactory<GoodsRemoteClient> {
    @Override
    public GoodsRemoteClient create(Throwable throwable) {
        return new GoodsRemoteClient() {
            @Override
            public ResultObject goods() {
                String message = throwable.getMessage();	// message即為錯(cuò)誤信息
                System.out.println("feign遠(yuǎn)程調(diào)用異常:" + message);
                return new ResultObject();
            }
        };
    }
}

請(qǐng)求壓縮feign.compression

Spring Cloud Feign 支持對(duì)請(qǐng)求和響應(yīng)進(jìn)行GZIP壓縮,以減少通信過程中的性能損耗。通過下面的參數(shù)即可開啟請(qǐng)求與響應(yīng)的壓縮功能:

feign:
  compression:
    request:
      enabled: true
    response:
      enabled: true

也可以對(duì)請(qǐng)求的數(shù)據(jù)類型,以及觸發(fā)壓縮的大小下限進(jìn)行設(shè)置,只有超過這個(gè)大小的請(qǐng)求才會(huì)對(duì)其進(jìn)行壓縮:

feign:
  compression:
    request:
      enabled: true
      mime-types: text/xml,application/xml,application/json
      min-request-size: 2048

日志級(jí)別

通過logging.level.xx=debug來設(shè)置日志級(jí)別。然而這個(gè)對(duì)Fegin客戶端而言不會(huì)產(chǎn)生效果。因?yàn)?code>@FeignClient注解修改的客戶端在被代理時(shí),都會(huì)創(chuàng)建一個(gè)新的Fegin.Logger實(shí)例,所以需要額外指定這個(gè)日志的級(jí)別才可以。

Feign支持4種日志級(jí)別:

  • NONE:不記錄任何日志信息,這是默認(rèn)值。
  • BASIC:僅記錄請(qǐng)求的方法,URL以及響應(yīng)狀態(tài)碼和執(zhí)行時(shí)間
  • HEADERS:在BASIC的基礎(chǔ)上,額外記錄了請(qǐng)求和響應(yīng)的頭信息
  • FULL:記錄所有請(qǐng)求和響應(yīng)的明細(xì),包括頭信息、請(qǐng)求體、元數(shù)據(jù)。

全局配置

方式一:配置文件屬性實(shí)現(xiàn)

feign:
  client:
    config:
      default:    # 將調(diào)用的微服務(wù)名稱設(shè)置為default即為配置成全局
        loggerLevel: FULL

方式一:代碼實(shí)現(xiàn)

//在啟動(dòng)類上為@EnableFeignClients注解添加defaultConfiguration配置
@EnableFeignClients(defaultConfiguration = FeignConfig.class)

細(xì)粒度(指定服務(wù)配置)

方式一:配置文件實(shí)現(xiàn)

feign:
  client:
    config:
      server-1:        # 想要調(diào)用的微服務(wù)名稱
        loggerLevel: FULL

方式二:代碼實(shí)現(xiàn)

1)編寫配置類,定義日志級(jí)別

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

2)在FeignClient中指定配置類:(可以省略)

@FeignClient(value = "user-service", configuration = FeignConfig.class)
// 添加FeignClient,指定服務(wù)ID
public interface UserClient {
    @GetMapping("/user/{id}")
    User getById(@PathVariable("id") Long id);
}

Feign每次訪問的日志示例:

到此這篇關(guān)于SpringCloud超詳細(xì)講解Feign聲明式服務(wù)調(diào)用的文章就介紹到這了,更多相關(guān)SpringCloud Feign內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring AOP注解失效的坑及JDK動(dòng)態(tài)代理

    Spring AOP注解失效的坑及JDK動(dòng)態(tài)代理

    這篇文章主要介紹了Spring AOP注解失效的坑及JDK動(dòng)態(tài)代理,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-03-03
  • Flask接口如何返回JSON格式數(shù)據(jù)自動(dòng)解析

    Flask接口如何返回JSON格式數(shù)據(jù)自動(dòng)解析

    這篇文章主要介紹了Flask接口如何返回JSON格式數(shù)據(jù)自動(dòng)解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • 詳述 DB2 分頁(yè)查詢及 Java 實(shí)現(xiàn)的示例

    詳述 DB2 分頁(yè)查詢及 Java 實(shí)現(xiàn)的示例

    本篇文章主要介紹了詳述 DB2 分頁(yè)查詢及 Java 實(shí)現(xiàn)的示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • Java定時(shí)器Timer與TimerTask的使用詳解

    Java定時(shí)器Timer與TimerTask的使用詳解

    這篇文章主要介紹了Java定時(shí)器Timer與TimerTask的使用詳解,在JDK類庫(kù)中Timer主要負(fù)責(zé)計(jì)劃任務(wù)的功能,也就是在指定時(shí)間執(zhí)行某一任務(wù),執(zhí)行時(shí)候會(huì)在主線程之外起一個(gè)單獨(dú)的線程執(zhí)行指定的任務(wù),該類主要是設(shè)置任務(wù)計(jì)劃,但封裝的類是TimerTask類,需要的朋友可以參考下
    2023-10-10
  • Java國(guó)際化簡(jiǎn)介_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java國(guó)際化簡(jiǎn)介_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要為大家簡(jiǎn)單介紹了Java國(guó)際化的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Java?GenericObjectPool?對(duì)象池化技術(shù)之SpringBoot?sftp?連接池工具類詳解

    Java?GenericObjectPool?對(duì)象池化技術(shù)之SpringBoot?sftp?連接池工具類詳解

    這篇文章主要介紹了Java?GenericObjectPool?對(duì)象池化技術(shù)之SpringBoot?sftp?連接池工具類詳解,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • 使用SpringBoot配置多數(shù)據(jù)源的經(jīng)驗(yàn)分享

    使用SpringBoot配置多數(shù)據(jù)源的經(jīng)驗(yàn)分享

    這篇文章主要介紹了使用SpringBoot配置多數(shù)據(jù)源的經(jīng)驗(yàn)分享,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • java 中ThreadLocal本地線程和同步機(jī)制的比較

    java 中ThreadLocal本地線程和同步機(jī)制的比較

    這篇文章主要介紹了java 中ThreadLocal本地線程和同步機(jī)制的比較的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • SpringBoot Security整合JWT授權(quán)RestAPI的實(shí)現(xiàn)

    SpringBoot Security整合JWT授權(quán)RestAPI的實(shí)現(xiàn)

    這篇文章主要介紹了SpringBoot Security整合JWT授權(quán)RestAPI的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • Spring中的SpringData詳細(xì)說明

    Spring中的SpringData詳細(xì)說明

    這篇文章主要介紹了Spring中的SpringData詳細(xì)說明,Spring Data 是Spring 的一個(gè)子項(xiàng)目, 旨在統(tǒng)一和簡(jiǎn)化對(duì)各類型持久化存儲(chǔ), 而不拘泥于是關(guān)系型數(shù)據(jù)庫(kù)還是NoSQL 數(shù)據(jù)存儲(chǔ),需要的朋友可以參考下
    2023-11-11

最新評(píng)論