最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring http服務(wù)遠(yuǎn)程調(diào)用實現(xiàn)過程解析

 更新時間:2020年06月11日 08:49:50   作者:Zs夏至  
這篇文章主要介紹了Spring http服務(wù)遠(yuǎn)程調(diào)用實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

最近公司有個新的需求,寫了一個接口,想要把服務(wù)暴露出去,但是這個服務(wù)所在的進程是非web項目,(可以理解成schedule/batch等進程項目),所以沒有tomcat等容器,而且只有這一個服務(wù),無論是加dubbo服務(wù)還是加tomcat等容器都顯得復(fù)雜了。那么應(yīng)該如何將服務(wù)暴露出去?

經(jīng)過網(wǎng)上搜索后,最終解決問題,記錄在此。

為了快速搭建,使用springboot來搭建項目:

項目結(jié)構(gòu)如圖:

首先需要創(chuàng)建一個接口,服務(wù)的提供者和服務(wù)的調(diào)用方都依賴這個模塊。

package com.xiazhi.spring.service.api;

import com.sun.istack.internal.NotNull;
import com.sun.istack.internal.Nullable;

/**
 * @author 趙帥
 * @date 2020/6/8
 */
public interface IUserService {

  /**
   * 獲取姓名
   * @return 姓名
   */
  String getName();

  /**
   * 根據(jù)姓名獲取年齡
   * @param name 姓名
   * @return 年齡
   */
  @NotNull
  Integer getAge(@Nullable String name);
}

然后在service模塊中,實現(xiàn)接口作為服務(wù)的提供方,需要依賴的jar包有:

<dependencies>
    <dependency>
      <groupId>com.xiazhi</groupId>
      <artifactId>spring-service-api</artifactId>
      <version>${project.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
      <exclusions>
        <exclusion>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
      </exclusions>
    </dependency>

    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>2.5</version>
    </dependency>
  </dependencies>

配置文件需要加上:

spring.main.web-application-type=none

實現(xiàn)接口:

package com.xiazhi.spring.service.impl;

import com.sun.istack.internal.NotNull;
import com.sun.istack.internal.Nullable;
import com.xiazhi.spring.service.api.IUserService;
import org.springframework.stereotype.Service;

/**
 * @author 趙帥
 * @date 2020/6/8
 */
@Service
public class UserServiceImpl implements IUserService {

  @Override
  public String getName() {
    return "張一";
  }

  @Override
  @NotNull
  public Integer getAge(@Nullable String name) {
    if ("".equals(name)) {
      return 10;
    }
    return 18;
  }
}

暴露服務(wù):

package com.xiazhi.spring.service.config;

import com.sun.net.httpserver.HttpHandler;
import com.xiazhi.spring.service.api.IUserService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.task.TaskExecutor;
import org.springframework.remoting.httpinvoker.SimpleHttpInvokerServiceExporter;
import org.springframework.remoting.support.SimpleHttpServerFactoryBean;

import java.util.HashMap;
import java.util.Map;

/**
 * @author 趙帥
 * @date 2020/6/8
 */
@Configuration
public class HttpInvokerConfiguration {

  private final IUserService userService;
  private final TaskExecutor taskExecutor;

  public HttpInvokerConfiguration(IUserService userService, TaskExecutor taskExecutor) {
    this.userService = userService;
    this.taskExecutor = taskExecutor;
  }

  /**
   * 將IUserService服務(wù)暴露出去
   */
  @Bean
  public SimpleHttpInvokerServiceExporter serviceExporter() {
    SimpleHttpInvokerServiceExporter exporter = new SimpleHttpInvokerServiceExporter();
    exporter.setService(userService);
    exporter.setServiceInterface(IUserService.class);
    return exporter;
  }

  /**
   * 為暴露的服務(wù)啟用http服務(wù)
   * @return httpServer工廠類
   */
  @Bean
  public SimpleHttpServerFactoryBean serverFactoryBean() {
    SimpleHttpServerFactoryBean factoryBean = new SimpleHttpServerFactoryBean();
    Map<String, HttpHandler> map = new HashMap<>(2);
    factoryBean.setContexts(map);
    factoryBean.setPort(9999);
    factoryBean.setExecutor(taskExecutor);
    return factoryBean;
  }
}

啟動服務(wù)。

然后是服務(wù)的調(diào)用方,依賴有:

<dependencies>
    <dependency>
      <groupId>com.xiazhi</groupId>
      <artifactId>spring-service-api</artifactId>
      <version>${project.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
  </dependencies>

配置文件:

package com.xiazhi.spring.config;

import com.xiazhi.spring.service.api.IUserService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean;

/**
 * @author 趙帥
 * @date 2020/6/8
 */
@Configuration
public class HttpServiceConfiguration {

  /**
   * 使用http代理工廠調(diào)用服務(wù)
   * @return http代理工廠創(chuàng)建代理對象
   */
  @Bean
  public HttpInvokerProxyFactoryBean httpInvokerProxyFactoryBean() {
    HttpInvokerProxyFactoryBean factoryBean = new HttpInvokerProxyFactoryBean();
    factoryBean.setServiceUrl("http://localhost:9999/userService");
    factoryBean.setServiceInterface(IUserService.class);
    return factoryBean;
  }
}

使用接口,調(diào)用方法:

package com.xiazhi.spring.controller;

import com.xiazhi.spring.service.api.IUserService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author 趙帥
 * @date 2020/6/8
 */
@RestController
public class UserController {

  private final IUserService userService;

  public UserController(IUserService userService) {
    this.userService = userService;
  }

  @GetMapping("/test")
  public String test() {
    String name = userService.getName();
    Integer age = userService.getAge(null);
    System.out.println(String.format("姓名:[%s],age:[%s]", name, age));
    return name;
  }
}

運行,調(diào)用test路徑測試調(diào)用結(jié)果。

項目完整結(jié)構(gòu):

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python給exe添加以管理員運行的屬性方法詳解

    Python給exe添加以管理員運行的屬性方法詳解

    這篇文章主要為大家介紹了Python給exe添加以管理員運行的屬性方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • 詳解如何使用Python實現(xiàn)過濾指定進程

    詳解如何使用Python實現(xiàn)過濾指定進程

    Python提供了多種方式來實現(xiàn)對進程的過濾和操作,本文將介紹如何利用Python來過濾指定進程,并展示一些實用的技巧和方法,希望對大家有所幫助
    2024-04-04
  • 常見的在Python中實現(xiàn)單例模式的三種方法

    常見的在Python中實現(xiàn)單例模式的三種方法

    這篇文章主要介紹了常見的在Python中實現(xiàn)單例模式的三種方法,單例模式在各個編程語言的學(xué)習(xí)中都是需要掌握的基礎(chǔ)知識,需要的朋友可以參考下
    2015-04-04
  • 你喜歡籃球嗎?Python實現(xiàn)籃球游戲

    你喜歡籃球嗎?Python實現(xiàn)籃球游戲

    今天帶大家學(xué)習(xí)的是關(guān)于Python的相關(guān)知識,文章圍繞著Python如何實現(xiàn)籃球游戲展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • python+OpenCV人臉識別考勤系統(tǒng)實現(xiàn)的詳細(xì)代碼

    python+OpenCV人臉識別考勤系統(tǒng)實現(xiàn)的詳細(xì)代碼

    作為一個基于人臉識別算法的考勤系統(tǒng)的設(shè)計與實現(xiàn)教程,以下內(nèi)容將提供詳細(xì)的步驟和代碼示例。本教程將使用 Python 語言和 OpenCV 庫進行實現(xiàn),需要的朋友可以參考下
    2023-05-05
  • python讀出當(dāng)前時間精度到秒的代碼

    python讀出當(dāng)前時間精度到秒的代碼

    在本文里小編給各位分享了一篇關(guān)于python怎么讀出當(dāng)前時間精度到秒的內(nèi)容,對此有需要的朋友們可以學(xué)習(xí)參考下。
    2019-07-07
  • 淺談配置OpenCV3 + Python3的簡易方法(macOS)

    淺談配置OpenCV3 + Python3的簡易方法(macOS)

    下面小編就為大家分享一篇淺談配置OpenCV3 + Python3的簡易方法(macOS),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • python微信公眾號開發(fā)簡單流程實現(xiàn)

    python微信公眾號開發(fā)簡單流程實現(xiàn)

    這篇文章主要介紹了python微信公眾號開發(fā)簡單流程實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • Python Pandas 箱線圖的實現(xiàn)

    Python Pandas 箱線圖的實現(xiàn)

    這篇文章主要介紹了Python Pandas 箱線圖的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • pytorch 實現(xiàn)變分自動編碼器的操作

    pytorch 實現(xiàn)變分自動編碼器的操作

    這篇文章主要介紹了pytorch 實現(xiàn)變分自動編碼器的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-05-05

最新評論

永川市| 米林县| 仁化县| 岳阳市| 靖宇县| 德化县| 潍坊市| 澄迈县| 南木林县| 阿拉善右旗| 黄石市| 平利县| 客服| 常州市| 二连浩特市| 嘉禾县| 巢湖市| 安陆市| 随州市| 海安县| 临西县| 仁寿县| 岢岚县| 称多县| 达州市| 青州市| 都江堰市| 沁阳市| 朝阳区| 衡南县| 买车| 达州市| 东港市| 房山区| 荥阳市| 秦安县| 平和县| 贵州省| 锦州市| 陆川县| 沙雅县|