spring 调用python_Spring http服务远程调用实现过程解析
最近公司有個新的需求,寫了一個接口,想要把服務暴露出去,但是這個服務所在的進程是非web項目,(可以理解成schedule/batch等進程項目),所以沒有tomcat等容器,而且只有這一個服務,無論是加dubbo服務還是加tomcat等容器都顯得復雜了。那么應該如何將服務暴露出去?
經過網上搜索后,最終解決問題,記錄在此。
為了快速搭建,使用springboot來搭建項目:
項目結構如圖:
首先需要創建一個接口,服務的提供者和服務的調用方都依賴這個模塊。
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();
/**
* 根據姓名獲取年齡
* @param name 姓名
* @return 年齡
*/
@NotNull
Integer getAge(@Nullable String name);
}
然后在service模塊中,實現接口作為服務的提供方,需要依賴的jar包有:
com.xiazhi
spring-service-api
${project.version}
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-tomcat
javax.servlet
servlet-api
2.5
配置文件需要加上:
spring.main.web-application-type=none
實現接口:
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;
}
}
暴露服務:
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服務暴露出去
*/
@Bean
public SimpleHttpInvokerServiceExporter serviceExporter() {
SimpleHttpInvokerServiceExporter exporter = new SimpleHttpInvokerServiceExporter();
exporter.setService(userService);
exporter.setServiceInterface(IUserService.class);
return exporter;
}
/**
* 為暴露的服務啟用http服務
* @return httpServer工廠類
*/
@Bean
public SimpleHttpServerFactoryBean serverFactoryBean() {
SimpleHttpServerFactoryBean factoryBean = new SimpleHttpServerFactoryBean();
Map map = new HashMap<>(2);
factoryBean.setContexts(map);
factoryBean.setPort(9999);
factoryBean.setExecutor(taskExecutor);
return factoryBean;
}
}
啟動服務。
然后是服務的調用方,依賴有:
com.xiazhi
spring-service-api
${project.version}
org.springframework.boot
spring-boot-starter-web
配置文件:
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代理工廠調用服務
* @return http代理工廠創建代理對象
*/
@Bean
public HttpInvokerProxyFactoryBean httpInvokerProxyFactoryBean() {
HttpInvokerProxyFactoryBean factoryBean = new HttpInvokerProxyFactoryBean();
factoryBean.setServiceUrl("http://localhost:9999/userService");
factoryBean.setServiceInterface(IUserService.class);
return factoryBean;
}
}
使用接口,調用方法:
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;
}
}
運行,調用test路徑測試調用結果。
項目完整結構:
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持我們。
本文標題: Spring http服務遠程調用實現過程解析
本文地址: http://www.cppcns.com/jiaoben/python/318472.html
總結
以上是生活随笔為你收集整理的spring 调用python_Spring http服务远程调用实现过程解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 皇室战争狗球流打法是什么(17173皇室
- 下一篇: 喝的人越来越少!星巴克向中国三四线城市进