基于Spring Boot 2.X的API功能

全新一代API网关,带可视化管理,文档贼友好! 摘要 提到API网关,大家比较熟悉的有Spring Cloud体系中的Gateway和Zuul,这些网关在使用的时候基本都要修改配置文件或自己开发功能。今天给大家介绍一款功能强大的API网关apisix,自带可视化管理功能,多达三十种插件支持,希望对大家有所帮助! 简介 apisix是一款云原生微服务API网关,可以为API提供终极性能、安全性、开源和可扩展的平台。apisix基于Nginx和etcd实现,与传统API网关相比,apisix具有动态路由和插件热加载,特别适合微服务系统下的API管理。 核. 阅读详情

背景

目前各系统之间的数据交互越来越频繁,频繁的给项目增加接口不仅增加整个系统的负担,还给开发人员麻烦,开发效率低,日常维护起来更是嫌弃;最近几年Spring微服务非常火,基于Spring Boot的Spring Cloud已经成为一站式微服务框架;准备入手Spring Cloud;首先从Spring Boot下手,使用Spring Boot写了个通用型的第三方接口功能,目前主要用于查询数据抛给调用者;其实也比较简单,主要就是实现业务逻辑,对于访问数据层是直接使用以前项目访问的方式,打成jar包,直接依赖使用等等;然后就是定义一下接口的规范,过滤掉一部分URL,输入的URI必须包含指定访问哪个数据库,条件可选;输出必须让调用者知道调用接口后的结果,尽可能简单明了;至于调用者需要哪些数据则需要双方协调沟通,配置好sql语句;尽可能实现调用者的需求。

具体实现

一、前提条件
1.安装JDK8或以上(springBoot 2.X版本)
2.开发工具(Eclipse或IDEA等,本次使用的Eclipse)
3.Spring开发套件工具(springsource-tool-suite)
4.apache-maven

二、开发准备
1.eclipse中安装Spring开发套件工具(下载时注意查看eclipse版本对应的springSource-tool-suite版本)
使用SpringSource-tool-suite插件是为开发Spring应用程序而定制的,它提供一个随时可用的环境来实现调试、运行和部署Spring应用程式,插件(sts3版本)集成了Pivatal tc Server(企业级的轻量java应用服务器,拓展了Apache Tomcat;可以说是企业版本的Apache Tomcat)、Pivotal Cloud Foundry(PCF是一个统一的多云平台,可以运行你的企业应用程序)、Git(分布式版本控制系统)、Maven(项目管理工具)、AspectJ(面向切面的框架AOP,拓展了java语言)等等。

1.1离线安装springSource-tool-suite
(1)下载(地址:https://spring.io/tools3/sts/all)
下载对应版本
(2)打开Eclipse–>help–>install New Software…

安装插件
(3)直接默认下一步Next,等待安装完成即可;安装完成之后就可以建Spring项目了。直接输入相关名称,然后默认下一步Next即可完成。

在这里插入图片描述
三、开发过程

(1)Spring Boot项目结构
主要用到几个目录和文件:
1)src/main/java目录:建java项目文件等等;其中包含主程序入口xxxxApplication.java文件,通过直接运行该类来启动Spring Boot应用
2)src/main/resources:配置目录,该目录用来存放应用的一些配置信息,比如应用名、服务端口、数据库配置等等,也可以存放一些静态资源,如一些图片、CSS文件、template模板文件等等;
3)src/test/java:单元测试目录,生成的xxxxApplicationTests通过JUnit4实现,可以直接运行Spring Boot进行测试。
4)application.properties:用于存放程序的各种依赖模块的配置信息,比如服务端口,数据库连接配置等等;目前
设置了第三使用方接口服务端口server.port=10101。
5)pom.xml:maven项目文件,主要用于管理:源代码、配置文件、开发者的信息和角色、问题追踪系统、组织信息、项目授权、项目的URL、项目的依赖关系。
在这里插入图片描述
(2)pom.xml文件基本解析

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"  
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0  
                      http://maven.apache.org/maven-v4_0_0.xsd">
    <!--
    	POM的版本
    -->
    <modelVersion>4.0.0</modelVersion>
    <!-- 
        含义:组织标识,定义了项目属于哪个组
        用途:此名称则是本地仓库中的路径
        命名规范:项目名称,模块,子模块
    -->
    <groupId>com.demo</groupId>
    <!-- 
        含义:项目名称也可以说你所模块名称,定义当面Maven项目在组中唯一的ID
        用途:例如:filter,在M2_REPO目录下,将是:com/demo/filter对应下的目录
        命名规范:唯一就好
    -->
    <artifactId>filter</artifactId>
    <!-- 
        含义:项目当前的版本号
        用途:例如:0.0.1-SNAPSHOT,在M2_REPO目录下,将是:com/demo/filter/0.0.1-SNAPSHOT目录
    -->
    <version>0.0.1-SNAPSHOT</version>
    <!-- 打包的格式,可以为:pom , jar , maven-plugin , ejb , war , ear , rar , par -->
    <packaging>war</packaging>
    <!-- 元素声明了一个对用户更为友好的项目名称 -->
    <name>Spring-Boot-Demo</name>
    <!-- 依赖继承的父类的jars -->
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.0.3.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<!--
	相关属性配置,如改变版本号、统一编码方式等等  
	-->
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
		<springfox.version>2.2.2</springfox.version>
		<maven.compiler.source>1.8</maven.compiler.source>
    	<maven.compiler.target>1.8</maven.compiler.target>
    	<skipTests>true</skipTests>
	</properties>
	<!-- 
	依赖的额外jar包 ,根据自己实际需要去依赖,如果maven的中央库有就直接去取;
	本地仓库需要自己指定或直接导到项目目录,依赖指定位置即可,groupId、artifacId和version名字随便取
	-->
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
		    <groupId>org.apache.commons</groupId>
		    <artifactId>commons-text</artifactId>
		    <version>1.6</version>
		</dependency>
		<dependency>
		    <groupId>io.springfox</groupId>
		    <artifactId>springfox-swagger2</artifactId>
		    <version>${springfox.version}</version>
		 </dependency>
		 <dependency>
		    <groupId>io.springfox</groupId>
		    <artifactId>springfox-swagger-ui</artifactId>
		    <version>${springfox.version}</version>
		 </dependency>    
	    <dependency>
		   <groupId>org.springframework.boot</groupId>
		   <artifactId>spring-boot-starter-tomcat</artifactId>
		   <scope>provided</scope>
		</dependency>
	</dependencies>
	<!-- 使用spring boot Maven插件将依赖的jar包生成可执行jar包 -->	
	<build>
	     <plugins>
            <plugin>
                 <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                    <configuration>
                       <mainclass>com.myselft.ThirdPartyInterfaceApplication</mainclass>
                    </configuration>
                </plugin>
      		 <plugin>
                 <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                    <configuration>
                       <includeSystemScope>true</includeSystemScope>
                    </configuration>
                </plugin>
        </plugins>
	</build>
</project>

(3)程序设计
1)基本设计流程
如下:
在这里插入图片描述

2)程序设计

One: 最主要的Application.java文件;

/*
1.导入java基本依赖包
2.导入spring boot基本依赖包
3.导入自己的需求包;如操作IO流的工具包,自定义的过滤器、还有一些基本封装工具包
*/
import java.util.ArrayList;
import java.util.List;
import javax.servlet.Filter;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.context.annotation.Bean;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import com.myself.filter.ThirdPartyCommonFilter;
import com.myself.util.IOUtil;
/*
使用的注解:
1.@EnableSwagger2: 启动Swagger;使用Swagger生成API,可以得到交互式文档,自动生成代码的SDK以及API的发现特性等等;
					其实Swagger就是一个简单、功能强大的API表达工具;在springboot中的主要功能:
					方便进行测试后台的restful形式的接口,实现动态的更新,当我们在后台的接口修改了以后。swagger
					可以实现自动的更新,而不需要单独使用一些工具(如postman)来测试后台修改的接口。目前没有使用到,
					先启动再说;依赖的jar包在
					pom.xml文件引入:
							<dependency>
							    <groupId>io.springfox</groupId>
							    <artifactId>springfox-swagger2</artifactId>
							    <version>2.2.2</version>
							 </dependency>
							 <dependency>
							    <groupId>io.springfox</groupId>
							    <artifactId>springfox-swagger-ui</artifactId>
							    <version>2.2.2</version>
							 </dependency>

2.@Bean:注解会将方法中的返回对象在SpringBoot启动的时候放入IOC容器中,加载时自动实现实例化
*/
@EnableSwagger2
public class ThirdPartyInterfaceApplication extends SpringBootServletInitializer {
	//注册Filter
	@Bean
	public FilterRegistrationBean<Filter> filterRegistrationBean(){
	/*
	1.创建并注册filter;
	ThirdPartyCommonFilter类为自定义的过滤器
	*/
		FilterRegistrationBean<Filter> regFilter=new FilterRegistrationBean<>();
		regFilter.setFilter(new ThirdPartyCommonFilter());
		List<String> urlHeader=new ArrayList<String>();
		//读取配置文件设置的需要过滤的url参数;自己封装的io工具类;方法可以自行
		String url=IOUtil.getPropertyByName("com.myself.url.header", "ConfigFile/myself.properties").trim();
		urlHeader.add(url);
		/*
		2.设置filter的相关属性
		*/
		regFilter.setUrlPatterns(urlHeader);//url过滤
		regFilter.setName("ThirdPartyCommon");//过滤器名称
		regFilter.setOrder(1);//过滤优先顺序
		regFilter.setEnabled(true);//设置过滤器是否有效
		return regFilter;//返回直接加载到IOC容器
		
	}
	public static void main(String[] args) {
		//主程序入口,加载启动xxxxApplication类文件
		SpringApplication.run(ThirdPartyInterfaceApplication.class, args);
	}

	/*
	override重写 configure方法;可以修改启动类
	*/
	@Override	
	protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
		return builder.sources(ThirdPartyInterfaceApplication.class);
		
	}
}

Two: 过滤器Filter文件

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.myself.thirdpartyinterface.controller.ThirdPartyCommonController;

/*
创建自己的过滤器并实现Filter接口,以及重写Filter接口的方法,init()、doFilter()、destroy()
*/
public class ThirdPartyCommonFilter implements Filter {

	//Filter过滤器初始化
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub
		
	}
	//过滤器所需要做的事情;即从接收到请求request之后所做的一系列动作,最后response响应返回
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		// TODO Auto-generated method stub
		//1.满足条件之后就会去该控制器执行自己设计的业务逻辑
		ThirdPartyCommonController commonController=new ThirdPartyCommonController();
		//2.设置request和response
		HttpServletRequest req = (HttpServletRequest) request;
		HttpServletResponse resp = (HttpServletResponse) response;
		//3.设置访问权限属性,设置无限制		
		resp.setHeader("Access-Control-Allow-Origin", "*");
		resp.setHeader("Access-Control-Allow-Methods", "*");
		resp.setHeader("Access-Control-Allow-Headers", "*");
		//4.请求方法为OPTIONS时不做任何处理
		if(req.getMethod().equals("OPTIONS")) {
			resp.setStatus(HttpServletResponse.SC_OK);
			return;
		}
		//5.设置响应的编码方式和响应返回的数据格式为json格式
		resp.setCharacterEncoding(request.getCharacterEncoding());
		resp.setContentType("application/json");		
		//6.开始过滤部分接收到的url,符合要求就继续往下执行业务;并返回结果
		if(!req.getParameterMap().containsKey("TokenId")) {
			//7.请求参数没有包含TokenId
			resp.setStatus(HttpServletResponse.SC_BAD_REQUEST);//400
			resp.getWriter().write("The Request param: TokenId can not null!");
		}else {
			resp.setStatus(HttpServletResponse.SC_OK);//200
			//8.进入controller执行业务,并将返回结果响应给调用者
			resp.getWriter().write(commonController.dealRequest(req));
		}

	}
	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		
	}

}

Three: controller业务逻辑控制层

import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.myselft.action.Constants;
import com.myself.thirdpartyinterface.service.ThirdPartyCommonService;
import com.myself.util.IOUtil;
import net.sf.json.JSONObject;

public class ThirdPartyCommonController {

	private static Logger log=LoggerFactory.getLogger(ThirdPartyCommonController.class);
	private ThirdPartyCommonService commonService=new ThirdPartyCommonService(log);	
	/*
	 * 处理request请求
	 * @param HttpServletRequest
	 * @return String
	 * */
	public String dealRequest(HttpServletRequest request)  {
		JSONObject jsonObj_res=new JSONObject();//返回响应的结果信息
		jsonObj_res.put("Result", "Fail");
		jsonObj_res.put("Message", "response fail");
		String url_match=IOUtil.getPropertyByName("com.myself.url.header", "ConfigFile/myself.properties").trim();
		/*
		 * 1.获取请求url的信息,包括:url、api_path_name、参数key-value值
		 * 
		 * */
		String url=request.getRequestURI();	//获取url
		String api_path_name=url.substring(url_match.length()-2);//获取api_path_name
		JSONObject jsonObj=new JSONObject();//用来保存请求传过来的所有参数
		Map<String, String[]> maps=request.getParameterMap();//获取参数的key-value值
		for(String key:maps.keySet()) {//遍历请求的参数值
			String value=maps.get(key)[0].toString();
			if(!value.equals("")) {
				jsonObj.put(key.toUpperCase(), value);
			}
		}
		/*
		 * 2.根据api_path_name获取需要查询的信息
		 * 包括:
		 * 1).所做的动作action,如query,add,update,delete
		 * 2).api_path_name,获取执行的环境schema和执行的sql
		 * 3).将sql的参数使用请求保存的jsonObj来代替
		 * */
		String selectInfo=commonService.getInfoToUri(api_path_name);
		if(selectInfo.startsWith("Exception")) {//异常
			jsonObj_res.put("Result", "Exception");
			jsonObj_res.put("Message", selectInfo.substring(10));
		}else if(selectInfo.equals("[]")){
			jsonObj_res.put("Message", "URL address Error,please Checked");
		}else{
			/*
			 * 3.根据jsonObj参数匹配并替换掉selectInfo的sql参数,并执行sql,返回json格式参数
			 * */
			String query_res=commonService.selectSQLjsonArr(jsonObj, selectInfo);
			if(query_res.startsWith("Exception")) {
				jsonObj_res.put("Result", "Exception");
				jsonObj_res.put("Message", query_res.substring(10));
			}else if(query_res.equals("Null")) {
				jsonObj_res.put("Message", "execute select sql not successed");
			}else {
				jsonObj_res.put("Result", "OK");
				jsonObj_res.put("Message", query_res);
			}
			
		}
		return jsonObj_res.toString();
	}
}

Four: service层,主要与数据库交道;目前此使用的是oracle数据库;真正抛送给用户数据的执行sql保存在数据表里面,需要自行配置

//导入操作一些自己操作数据库的基本包
import java.sql.SQLException;
import org.slf4j.Logger;
import com.myself.function.dao.BaseDao;
import com.myself.function.service.BaseServices;
import com.myself.util.JsonUtil;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

public class ThirdPartyCommonService extends BaseServices<BaseDao>{
	public ThirdPartyCommonService(Logger log) {
		super(log);
		// TODO Auto-generated constructor stub
	}

	/*
	 * 1.根据uri获取所有配置的相关信息
	 * @param String api_path_name
	 * @return String
	 * */	
		public String getInfoToUri(String api_path_name) {
			String query_sql="自己需要配置的额sql语句,用来查询相关信息;比如根据api_path_name来获取需要执行的sql语句";				
			try {
			/*
			1.1自己的工具包,将查询出来的结果集转化成jsonArray格式
				参数(sql语句,schema名称,条件参数)
			*/
				return JsonUtil.setToJsonArr(super.getResultSet(query_sql, "schema", new Object[]{api_path_name}));
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				return "Exception: "+e.getMessage();
			}	
		}
		
		/*
		 * 2.根据jsonObj参数匹配并替换掉selectInfo的sql参数,并执行sql,返回json格式参数
		 * @param JSONObject
		 * @param Sting 
		 * @return String 
		 * */
		public String  selectSQLjsonArr(JSONObject jsonObj,String selectInfo ) {
			String jsonArr_str="Null";
			JSONArray jsonArr=JSONArray.fromObject(selectInfo);
			ThirdPartyCommonService service=new ThirdPartyCommonService(log);
			if(jsonArr.size()>0) {
				for(int i=0;i<jsonArr.size();i++) {
					try {
					System.out.println(jsonArr.size());
					JSONObject jsonObj_param=jsonArr.getJSONObject(i);
					String schema=service.getSchemaToFactory(jsonObj.getString("TokenId"));
					String query_sql=jsonObj_param.getString("SQL");
					for(Object key:jsonObj.keySet()) {
						query_sql=query_sql.replaceAll("@"+key.toString().toUpperCase()+"@", jsonObj.get(key).toString());
					}			
					jsonArr_str=JsonUtil.setToJsonArr(super.getResultSet(query_sql, schema, new Object[] {}));
					} catch (SQLException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
						System.out.println(e.getMessage());
						jsonArr_str="Exception:"+e.getMessage();
						
					}				
				}
			}			
			return jsonArr_str;

		}
		/*
		 * 3.根据TokenId获取对应的数据库schema名称
		 * @param String
		 * @return String
		 * */
		public String getSchemaToFactory(String factory) throws SQLException {
			String query_sql=
					"根据TokenId来筛选获取对应去哪个数据库环境抓数据";
			String schema_qry=(String) super.getResultColumn("schema", query_sql, new Object[] {TokenId});
			return schema_qry;
			
		}
}

四、运行程序以及服务器简单jar部署
1)涉及到Maven相关配置的,如pom.xml文件,运行之前先Update Project…
在这里插入图片描述
2)然后直接RunAs–>Spring Boot App
在这里插入图片描述

3)生成jar包(war也是可以的;目前程式是前后端分离,所以jar包部署比较方便)
(1)RunAs–>Maven clean;清除之前生成的jar等相关文件。
(2)RunAs–>Maven install;生成可执行的jar包;
(3)之后会在项目下的target文件夹生成两个东西:xxx.jar和xxx.jar.original
PS:打包生成jar时Maven install会经常出现一个报错:
No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?
在这里插入图片描述
解决办法:
点击项目右键,选中Build Path–>Configure Build Path;
将JRE运行环境改为JDK即可。
在这里插入图片描述
4)将生成的在target的两个文件上传到服务器(目前使用的是linux服务器,需要有jdk8以上的运行环境);
然后指定目录;直接后台一直运行: java -jar xxxx.jar & ;即可启动成功:
在这里插入图片描述在这里插入图片描述

总结

此处省略三千行…;放手去盘spring boot吧

jdk8与jdk17的区别。springboot2.x与springboot3.x的区别 总的来说,JDK 17 是在 JDK 8 的基础上进一步发展和改进的版本,具有更多的语言特性、性能改进、安全性更新以及库和工具的改进。因此,对于那些使用 JDK 8 的开发人员来说,升级到 JDK 17 可能会带来许多好处,包括更好的开发体验、更高的性能和更好的安全性。总的来说,Spring Boot 3.x 是对 Spring Boot 2.x 的进一步改进和演进,旨在提供更好的性能、更多的功能和更好的开发体验。 阅读详情

相关推荐

spring-boot(整合jdbc)

JDBC 的全称是Java数据库连接(Java Database Connectivity,简称JDBC),是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口。提供了诸如查询和更新数据库中数据的方法,JDBC也是Sun Microsystems的商标。我们通常说的JDBC是面向关系型数据库的。

2302_79087378的博客 1238

Spring cloud Gateway 换成 Apache APISIX 云原生 API 网关初体验

Spring cloud Gateway 换成 Apache APISIX 云原生 API 网关初体验

MHXSH_1_0的博客 2243

Swagger UI深度解析与Spring Boot多版本集成指南

2025年最新实践:本文针对Spring Boot 2.x/3.x版本,详解Swagger UI的集成方案与高阶用法,助您打造专业级API文档系统。

weixin_42593797的博客 1308

SpringBoot2.x:快速开发插件与API规范

SpringBoot2.x快速开发插件与API规范(二) 准备工作 IDE: IntelliJ IDEA 2020.3 Java环境 jdk1.8 知识点 lombok PageHelper API接口返回统一化 萌新:小哥,我在实体类写了那么多get/set方法,看着很迷茫 > 小哥:那不是可以自动生成吗? > 萌新:虽然可以自动生成,但是如果我要修改某个变量的数据类型,我岂不是还要去修改get/set方法? > 小哥:哈哈,那我今天给你说一个插件,lombok可以解决你的

Java Pro 807

Spring Data Moore于2019年9月30日正式发布,适配Spring Boot 2.2.x版本,涵盖16个子模块,完成了超700项开发任务

Spring Data Moore于2019年9月30日正式发布,适配Spring Boot 2.2.x版本,涵盖16个子模块,完成了超700项开发任务。该版本核心聚焦响应式编程优化、Kotlin语言适配以及性能提升三大方向, finder方法运行速度最高提升60%,同时各子模块也有针对性功能升级,以下是详细中文分析:

[Blog][Domain] programb.blog.youkuaiyun.com 437

Spring框架5.2.0.RELEASE核心特性与应用

Spring框架最初由Rod Johnson开发,并在2003年首次发布,旨在简化Java企业级应用开发。它提供了一个全面的编程和配置模型,能够有效解决企业应用开发中的复杂性和挑战。

weixin_35706255的博客 658

Spring/Boot注解笔记

文章目录1. 获取配置信息1.1 @Value ① 用途② 配置③ 使用1.2 @ConfigurationProperties2. 对外提供二方包Bean注册2.1 @EnableAutoConfiguration 1. 获取配置信息 1.1 @Value ① 用途 Spring提供了获取properties文件中的配置值的方法,通过注解@Value的方式可以直接读取配置文件的配置值。 ② 配...

Shawn Hou 448

保姆级教程:在Ubuntu 22.04上从零安装SUMO并运行第一个交通仿真

本教程详细介绍了在Ubuntu 22.04系统上从零安装SUMO交通仿真软件并运行第一个仿真的完整流程。涵盖环境准备、PPA源安装、核心组件验证、首次仿真案例运行以及进阶配置技巧,特别针对netedit路网编辑器和地图格式转换等实用工具进行重点讲解,帮助用户快速掌握SUMO在交通仿真领域的应用。

weixin_30546189的博客 420

APISIX的安装与测试(springboot服务测试)

这个IP地址是你的服务器地址, 如果 APISIX 运行在 Docker 容器中,而你的服务直接运行在主机上,可能存在网络隔离问题。方法一,将你的服务放在同一个docker网络中(舍弃)。方法二直接使用服务器地址。如果你在安装 APISIX 时选择了 Docker 或 Helm 安装,那么 etcd 将会自动安装;就会接收到内容 “Hello 我是apisix222”将打包好的jar包上传到服务器上并执行。则网关会将请求转发到。

qq_63946922的博客 1344

汇率波动率建模实战:从GARCH到EGARCH的金融时间序列分析

在金融时间序列分析中,波动率建模是量化市场风险的核心技术。其基本原理在于捕捉金融资产收益率序列中存在的波动聚集、尖峰厚尾等典型特征。通过建立条件异方差模型,如GARCH及其扩展模型,可以动态估计和预测未来波动率,这对于资产定价、风险管理和投资决策具有重要价值。在金融工程领域,该技术广泛应用于外汇、股票和衍生品市场。本文以汇率波动率建模为具体场景,详细阐述了如何使用Python中的arch库,从数据预处理、模型选型(包括GARCH、EGARCH等)、参数估计到样本外预测评估的全流程实践,并深入探讨了模型在应对

weixin_32629853的博客 371

【论文解读】Baidu Apollo EM Motion Planner

系统顶层是一种多车道策略,通过并行计算车道级别轨迹来处理车道变更场景;在车道轨迹生成器内部,迭代的解决基于Frenet坐标的路径和速度规划;针对路径和速度规划问题,提出了动态规划与基于样条的二次规划相结合的方法,构造了一个可扩展且易于调整的框架,同时处理交通规则、障碍物决策和平滑度问题。该规划器可扩展至高速公路和城市低速驾驶场景。高精地图模块提供了任何人都可以访问的高精地图。感知和定位模块提供了动态环境中必要的信息。运动规划模块考虑生成一条安全平滑的轨迹再交由汽车的控制模块去执行。

xiewf的博客 6092

腾讯云短信 API v3 集成实战:Spring Boot 2.x 项目 5 步接入验证码功能

本文详细介绍了如何在Spring Boot 2.x项目中集成腾讯云短信API v3,实现验证码发送功能。从基础配置到核心代码实现,再到高级功能优化,提供了完整的实战指南,帮助开发者快速接入腾讯云短信服务,提升用户身份验证的安全性和效率。

weixin_29913663的博客 295

吊打BEVFormer!GaussianBeV实战:用3D高斯开启BEV分割新范式

GaussianBeV是一种基于3D高斯建模的BEV分割新方法,在自动驾驶感知任务中实现了SOTA性能。其核心创新在于将场景元素表示为3D高斯分布,通过均值、协方差和权重精确描述物体位置、形状和置信度,相比传统BEV方法具有更强的空间建模能力。文章详细介绍了GaussianBeV的原理、环境配置、训练推理流程及其在自动驾驶和城市3D重建中的应用,并讨论了优化方向和未来发展趋势。该方法在nuScenes等数据集上表现出色,为BEV分割任务提供了新的解决方案。

m0_71589036的博客 106

Spring Boot2.7.12配置API文档

本文介绍了在SpringBoot 2.5.x~2.7.x中使用Knife4j工具配置API文档的完整流程。1.引入knife4j-openapi2-spring-boot-starter依赖;2.配置application.yml中的Knife4j参数;3.创建Swagger配置类并添加关键注解;4.在Controller和实体类上添加相应注解。配置完成后,通过访问/doc.html即可获得增强的API文档界面

2301_81749893的博客 1369

流体动力学仿真软件:Star-CCM+_(19).软件定制与脚本编写

自定义插件开发可以扩展Star-CCM+的功能,实现特定的仿真需求。插件开发通常需要使用Java语言,并且需要对Star-CCM+的API有深入的了解。以下是一个简单的Java插件示例,展示如何创建一个自定义插件来显示仿真项目的信息。// 导入必要的Star-CCM+ API import star . ccm . product . CCMProject;// 自定义插件类 public class CustomPlugin {// 插件主方法 public void run() {

kkchenjj的博客 937

【YOLO26保姆级零踩坑教程】环境搭建+五大任务快速入门,一行代码实现检测/分割/姿态/OBB/分类(Win+Linux全适配)

YOLO26环境搭建与实战指南:零踩坑全适配 本文是YOLO26全栈技术专栏的入门篇,提供Windows/Linux双系统的纯实战环境搭建指南,主打零踩坑、全适配。YOLO26基于Ultralytics框架优化,无需编译源码或手动下载权重,原生支持多任务推理。 环境配置关键点: 必须安装Ultralytics 8.4.0及以上版本 支持CPU/GPU环境,推荐Python 3.8-3.11 提供清华源配置解决下载慢问题 安装步骤: CPU版:一键安装Ultralytics和OpenCV GPU版:匹配CUD

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 774

【微服务架构】SpringCloud(一):服务注册与发现(Eureka)、使用Spring Boot2.x Actuator监控应用

背景:在传统应用中,组件之间的调用,通过有规范的约束的接口来实现,从而实现不同模块间良好的协作。但是被拆分成微服务后,每个微服务实例的网络地址都可能动态变化,数量也会变化,使得原来硬编码的地址失去了作用。需要一个中心化的组件来进行服务的登记和管理。概念:实现服务治理,即管理所有的服务信息和状态。注册中心相当于买票乘车,只看有没有票(有没有服务),有就去买票(获取注册列表),然后乘车(调用)。不必关心有多少火车在运行。注册中心好处:不用关心有多少提供方。

专注上位机开发、机器视觉、机器学习、嵌入式软硬件开发 1万+

倍福控制第三方伺服走CSV模式--以汇川伺服为例

在使用TwinCAT软件控制标准CiA402协议的EtherCAT伺服时使用TwinCAT软件NC自带的运动控制指令控制伺服,此时伺服驱动器一般工作在CSP/CSV/CST模式。最常见伺服驱动器工作在CSP模式,轨迹规划运行在TwinCAT软件,位置环速度环电流环运行在伺服驱动器中。该模式下速度波动较大,需要极度平稳的速度需要采用CSV模式。本文讲述的是伺服驱动器工作在CSV模式,此时轨迹规划和位置环均运行在TwinCAT软件,速度环电流环运行在伺服驱动器中。为了简化文字描述,本文采用图文结合的方式介绍伺服

weixin_41883890的博客 4847

Spring Boot 2.x升3.x迁移太头疼?AI工具怎么自动改包名和依赖

摘要:SpringBoot 2.x到3.x的迁移涉及javax改jakarta包名、配置迁移、API变更等数十处细节修改,中型项目手动迁移需2-3天且易遗漏。2026年还需考虑3.x到4.0的兼容性问题,两次迁移叠加复杂度激增。飞算JavaAI的框架升级器可自动分析并批量处理版本差异,支持40+主流框架的跨版本升级,将迁移时间从数天压缩至20分钟,配合一键修复器解决意外编译错误,使版本迁移从"年度噩梦"变为高效可控的自动化流程。

CalEx_Tech的博客 310

深度强化学习在足式机器人中的应用 (一):基础原理与仿真环境

我们将首先深入探讨其背后的核心挑战与技术栈,然后详细推导机器人学和强化学习的基本数学原理,特别是剖析在机器人控制领域表现卓越的PPO算法。下面的独立Python脚本展示了Isaac Gym的基本API用法,加载一个Go1机器人(假设URDF已准备好),并让它执行一个简单的预设动作(正弦波运动),以此来熟悉仿真流程。:代码的核心是直接操作GPU上的PyTorch张量,避免了CPU和GPU之间的数据拷贝,这是实现高性能的关键。:所有计算(如伪策略中的正弦波计算)都应该是向量化的,一次性为所有。

VectorShift的博客 228

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

spring.boot.sapi.starter 常见问题解决方案

spring.boot.sapi.starter 常见问题解决方案 项目基础介绍 spring.boot.sapi.starter 是一个开源的 Restful API 输出工具,基于 Spring Boot 2.x 开发。它能够将项目中的所有 API 接口及参数以结构化的方式展示在页面上,并提供接口参数测试页面。这个工具极大地简化了 API 文档的生成和接口测试过程。项目主要使用 Java 语言...

gitblog_00138的博客 730

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Spring Boot 2.7.x 中 WebMvcConfigurer 深度解析(一):路径匹配与内容协商

java@Override// 自定义参数值映射此配置将参数值qq映射到媒体类型,当请求包含?format=qq时,系统将返回 JSON 格式响应。本节深入解析了:负责 URL 路径匹配策略,包括后缀处理和斜杠匹配:管理内容协商机制,支持多格式响应和 API 版本控制每个配置项都包含了丰富的扩展点,值得深入探索。后续内容将继续解析其他配置方法,帮助大家全面掌握 Spring MVC 的定制能力。

2501_93078354的博客 932

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Jackson View Extension Spring Boot Starter

Jackson View Extension Spring Boot Starter 是一个基于 Jackson 的 Spring Boot 扩展组件,提供比标准 @JsonView 更灵活的 JSON 序列化控制能力。该工具支持细粒度字段过滤、嵌套路径定位和敏感数据脱敏,无需修改实体类即可通过注解实现不同接口的差异化输出。

2403_89785620的博客 529

深入解析:如何应对Redisson与Spring Boot版本兼容性冲突的实战策略

在Java分布式系统开发中,Redisson作为基于Redis/Valkey的高级Java客户端,与Spring Boot的集成已成为现代微服务架构的标配。然而,当这两个强大的技术栈相遇时,版本兼容性问题常常成为开发者的痛点。本文将深入分析Redisson与Spring Boot版本冲突的根源,并提供一套系统性的应对策略,帮助开发者从容应对这一挑战。 ## 问题现象:识别版本冲突的典型症状 当

gitblog_00836的博客 467

Knife4j:Spring Boot API 文档增强利器

Knife4j 是一款基于 Swagger(OpenAPI)的 API 文档增强工具,专为 Java 开发者设计,尤其深度适配 Spring Boot 和 Spring Cloud 生态。它在前端 UI 界面、离线文档导出、接口调试体验等方面对原生 Swagger-UI 进行了大幅增强和优化,是目前国内 Java 社区中最受欢迎的 API 文档生成与调试工具之一。Knife4j 极大地提升了 Spring Boot 项目 API 文档的生成、阅读和调试体验。

2301_80954266的博客 103

基于Spring Boot的社区健康体检信息系统

Entity@Data@Id@OneToOne@Column@Lob@Lob@Lob@PreUpdate本文详细介绍了基于Spring Boot的社区健康体检信息系统的技术栈选型、架构设计、核心功能与代码实现。该系统利用Spring Boot生态的高效与便捷,快速构建了稳定可靠的后端服务。通过清晰的层次划分与模块化设计,保证了代码的可维护性与可扩展性。未来可扩展方向数据智能化: 集成机器学习模型,对历史体检数据进行趋势预测与疾病风险预警。

2501_93250029的博客 84
上一篇: JQuery中使用select2插件功能之自动完成下拉框动态加载匹配(本地数据与远程数据结合)
下一篇: Redis系列之简介及Linux安装
huahua.Dr
博客等级 码龄8年 87粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值