《SpringCloud超级入门》Spring Boot项目搭建步骤(超详细)《六》

目录

编写第一个 REST 接口

读取配置文件

profiles 多环境配置

热部署

actuator 监控

自定义 actuator 端点

统一异常处理

异步执行

随机端口

编译打包

在 Spring Tools 4 for Eclipse 中选择 File->New->Maven Project,
 

创建maven项目

在 pom.xml 中添加 Spring Boot 的依赖,

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.6.RELEASE</version>
</parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
</dependencies>

编写启动类,代码如下。

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

 启动类使用了 @SpringBootApplication 注解,这个注解表示该类是一个 Spring Boot 应用。直接运行 App 类即可启动,启动成功后在控制台输出信息,默认端口是 8080

Spring Boot启动成功
 Spring Boot启动成功


我们只在 pom.xml 中引入了一个 Web 的 Starter,然后创建一个普通的 Java 类,一个 Main 方法就可以启动一个 Web 项目。

与之前的使用方式相比,这种方式简单很多。以前需要配置各种 Spring 相关的包,还需要配置 web.xml 文件,还需要将项目放入 Tomcat 中去执行,搭建项目的过程还特别容易出错,会出现各种 jar 包冲突。有了 Spring Boot 后这些问题都解决了。

我们之所以能够通过一个 Main 方法启动一个 Web 服务,是因为 Sprig Boot 中内嵌了 Tomcat,然后通过内嵌的 Tomcat 来提供服务。当然,我们也可以使用别的容器来替换 Tomcat,比如 Undertow 或 Jetty。
 

编写第一个 REST 接口

创建一个控制器,编写第一个 REST 接口,访问地址使用 /hello,代码如下。

@RestController
public class HelloController {@GetMapping("/hello")public String hello() {return "hello";}
}

@RestController 是 @Controller 和 @ResponseBody 的组合注解,可以直接返回 Json 格式数据。

运行结果
  运行结果

读取配置文件

在以前的项目中我们主要在 XML 文件中进行框架配置,业务的相关配置会放在属性文件中,然后通过一个属性读取的工具类来读取配置信息。
Spring Boot 中的配置通常放在 application.properties 中,读取配置信息非常方便,总共分为 3 种方式。

1)Environment

可以通过 Environment 的 getProperty 方法来获取想要的配置信息,代码如下所示。

@RestController
public class HelloController {// 注入对象@Autowiredprivate Environment env;@GetMapping("/hello")public String hello() {// 读取配置String port = env.getProperty("server.port");return port;}
}

2)@Value

可以注入具体的配置信息,代码如下。

@RestController
public class HelloController {// 注入配置@Value("${server.port}")private String port;@GetMapping("/hello")public String hello() {return port;}
}

3)自定义配置类

prefix 定义配置的前缀,代码如下。

@ConfigurationProperties(prefix = "net.biancheng")
@Component
public class MyConfig {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}
}

读取配置的方法代码如下。

@RestController
public class HelloController {@Autowiredprivate MyConfig myConfig;@GetMapping("/hello")public String hello() {return myConfig.getName();}
}

定义配置 application.properties 的方法如下:

net.biancheng.name=zhangsan

profiles 多环境配置

在平时的开发中,项目会被部署到测试环境、生产环境,但是每个环境的数据库地址等配置信息都是不一样的。通过 profile 来激活不同环境下的配置文件就能解决配置信息不一样的问题。在 Spring Boot 中可以通过 spring.profiles.active=dev 来激活不同环境下的配置。

可以定义多个配置文件,每个配置文件对应一个环境,格式为 application-环境.properties,如表 1 所示。

在开发环境中,可以通过修改 application.properties 中的 spring.profiles.active 的值来激活对应环境的配置,在部署的时候可以通过 java–jar xxx.jar--spring.profiles.active=dev 来指定使用对应的配置。

热部署

开发过程中经常会改动代码,此时若想看下效果,就不得不停掉项目然后重启。
对于 Spring Boot 项目来说,启动时间是非常快的,在微服务的架构下,每个服务只关注自己的业务,代码量也非常小,这个启动时间是可以容忍的。

通过 spring-boot-devtools 就可以实现热部署。

只需要添加 spring-boot-devtools 的依赖即可实现热部署功能,代码如下所示。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId>
</dependency>

actuator 监控

Spring Boot 提供了一个用于监控和管理自身应用信息的模块,它就是 spring-boot-starter-actuator。该模块使用起来非常简单,只需要加入依赖即可,代码如下。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

启动项目我们会发现在控制台输出的内容中增加了 所示的信息。

比如,我们访问 /actuator/health 可以得到下面的信息:

{"status": "UP"
}

Spring Boot启动控制台输出
Spring Boot启动控制台输出

 Actuator端点信息

UP 表示当前应用处于健康状态,如果是 DOWN 就表示当前应用不健康。增加下面的配置可以让一些健康信息的详情也显示出来:

management.endpoint.health.show-details=ALWAYS

再次访问 /actuator/health,就可以得到健康状态的详细信息数据:

{"status": "UP","diskSpace": {"status": "UP","total": 491270434816,"free": 383870214144,"threshold": 10485760}
}

大部分端点默认都不暴露出来,我们可以手动配置需要暴露的端点。如果需要暴露多个端点,可以用逗号分隔,如下所示:

management.endpoints.web.exposure.include=configprops,beans

如果想全部端点都暴露的话直接配置成下面的方式:

management.endpoints.web.exposure.include=*

后面我们会介绍如何使用 Spring Boot Admin在页面上更加直观地展示这些信息,目前都是 Json 格式的数据,不方便查看。

自定义 actuator 端点

我们需要自定义一些规则来判断应用的状态是否健康,可以采用自定义端点的方式来满足多样性的需求。如果我们只是需要对应用的健康状态增加一些其他维度的数据,可以通过继承 AbstractHealthIndicator 来实现自己的业务逻辑。代码如下。

@Component
public class UserHealthIndicator extends AbstractHealthIndicator {@Overrideprotected void doHealthCheck(Builder builder) throws Exception {builder.up().withDetail("status", true);// builder.down().withDetail("status", false);}
}

通过 up 方法指定应用的状态为健康,down 方法指定应用的状态为不健康。withDetail 方法用于添加一些详细信息。访问 /actuator/health,可以得到我们自定义的健康状态的详细信息:

{"status": "UP","details": {"user": {"status": "UP","details": {"status": true}},"diskSpace": {"status": "UP","details": {"total":249795969024,"free": 7575375872,"threshold": 10485760}}}
}

上面我们是在框架自带的 health 端点中进行扩展,还有一种需求是完全开发一个全新的端点,比如查看当前登录的用户信息的端点。自定义全新的端点很简单,通过 @Endpoint 注解就可以实现。代码如下所示。

@Component
@Endpoint(id = "user")
public class UserEndpoint {@ReadOperationpublic List<Map<String, Object>> health() {List<Map<String, Object>> list = new ArrayList<>();Map<String, Object> map = new HashMap<>();map.put("userId", 1001);map.put("userName", "zhangsan");list.add(map);return list;}
}

 访问 /actuator/user 可以看到返回的用户信息如下:

[{"userName": "zhangsan","userId": 1001}
]

统一异常处理

对于接口的定义,我们通常会有一个固定的格式

{"status": true,"code": 200,"message": null,"data": [{"id": "101","name": "jack"},{"id": "102","name": "jason"}]
}

 如果调用方在请求我们的 API 时把接口地址写错了,就会得到一个 404 错误:

{"timestamp": 1492063521109,"status": 404,"error": "Not Found","message": "No message available","path": "/rest11/auth"
}

后端服务会告诉我们哪个地址没找到,其实也挺友好。但是因为我们上面自定义的数据格式跟下面的不一致,所以当用户拿到这个返回的时候是无法识别的,其中最明显的是 status 字段。

我们自定义的是 boolean 类型,用来表示请求是否成功,这里返回的就是 Http 的状态码,所以我们需要在发生这种系统错误时也能返回我们自定义的那种格式,那就要定义一个异常处理类(代码如下所示),通过这个类既可以返回统一的格式,也可以统一记录异常日志。

@ControllerAdvice
public class GlobalExceptionHandler {private Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);@ExceptionHandler(value = Exception.class)@ResponseBodypublic ResponseData defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception {logger.error("", e);ResponseData r = new ResponseData();r.setMessage(e.getMessage());if (e instanceof org.springframework.web.servlet.NoHandlerFoundException) {r.setCode(404);} else {r.setCode(500);}r.setData(null);r.setStatus(false);return r;}
}

 ResponseData 是我们返回格式的实体类,其发生错误时也会被捕获到,然后封装好返回格式并返回给调用方。在 Spring Boot 的配置文件中加上如下代码所示配置。

# 出现错误时, 直接抛出异常
spring.mvc.throw-exception-if-no-handler-found=true
# 不要为我们工程中的资源文件建立映射
spring.resources.add-mappings=false

 当我们调用一个不存在的接口时,返回的错误信息就是我们自定义的那种格式:

{"status": false, "code": 404,"message": "No handler found for GET /rest11/auth", "data": null
}

最后贴上 ResponseData 的定义,代码如下。

public class ResponseData {private Boolean status = true;private int code = 200;private String message;private Object data;// get set ...
}

异步执行

异步调用就是不用等待结果的返回就执行后面的逻辑;同步调用则需要等待结果再执行后面的逻辑。
通常我们使用异步操作时都会创建一个线程执行一段逻辑,然后把这个线程丢到线程池中去执行,代码如下所示。 

ExecutorService executorService = Executors.newFixedThreadPool(10);
executorService.execute(() -> {try {// 业务逻辑} catch (Exception e) {e.printStackTrace();} finally {}
});

这种方式尽管使用了 Java 的 Lambda,但看起来没那么优雅。在 Spring 中有一种更简单的方式来执行异步操作,只需要一个 @Async 注解即可,代码如下所示。

@Async
public void saveLog() {System.err.println(Thread.currentThread().getName());
}

我们可以直接在 Controller 中调用这个业务方法,它就是异步执行的,会在默认的线程池中去执行。需要注意的是,一定要在外部的类中去调用这个方法,如果在本类调用则不起作用,比如 this.saveLog()。最后在启动类上开启异步任务的执行,添加 @EnableAsync 即可。
 

@Configuration
@ConfigurationProperties(prefix = "spring.task.pool")
public class TaskThreadPoolConfig {// 核心线程数private int corePoolSize = 5;// 最大线程数private int maxPoolSize = 50;// 线程池维护线程所允许的空闲时间private int keepAliveSeconds = 60;// 队列长度private int queueCapacity = 10000;// 线程名称前缀private String threadNamePrefix = "FSH-AsyncTask-";// get set ...
}

 然后我们重新定义线程池的配置,代码如下所示。

@Configuration
public class AsyncTaskExecutePool implements AsyncConfigurer {private Logger logger = LoggerFactory.getLogger(AsyncTaskExecutePool.class);@Autowiredprivate TaskThreadPoolConfig config;@Overridepublic Executor getAsyncExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(config.getCorePoolSize());executor.setMaxPoolSize(config.getMaxPoolSize());executor.setQueueCapacity(config.getQueueCapacity());executor.setKeepAliveSeconds(config.getKeepAliveSeconds());executor.setThreadNamePrefix(config.getThreadNamePrefix());executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());executor.initia lize();return executor;}@Overridepublic AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {// 异步任务中异常处理return new AsyncUncaughtExceptionHandler() {@Overridepublic void handleUncaughtException(Throwable arg0, Method arg1, Object... arg2) {logger.error("==========================" + arg0.getMessage() + "=======================", arg0);logger.error("exception method:" + arg1.getName());}};}
}

配置完之后我们的异步任务执行的线程池就是我们自定义的了,我们可以在属性文件里面配置线程池的大小等信息,也可以使用默认的配置:

spring.task.pool.maxPoolSize=100

最后讲一下线程池配置的拒绝策略。当我们的线程数量高于线程池的处理速度时,任务会被缓存到本地的队列中。队列也是有大小的,如果超过了这个大小,就需要有拒绝的策略,不然就会出现内存溢出。目前支持两种拒绝策略:

  • AbortPolicy:直接抛出 java.util.concurrent.RejectedExecutionException 异常。
  • CallerRunsPolicy:主线程直接执行该任务,执行完之后尝试添加下一个任务到线程池中,这样可以有效降低向线程池内添加任务的速度。


建议大家用 CallerRunsPolicy 策略,因为当队列中的任务满了之后,如果直接抛异常,那么这个任务就会被丢弃。

随机端口

在实际的开发过程中,每个项目的端口都是定好的,通过 server.port 可以指定端口。
当一个服务想要启动多个实例时,就需要改变端口,特别是在我们后面进行 Spring Cloud习的时候,服务都会注册到注册中心里去,为了能够让服务随时都可以扩容,在服务启动的时候能随机生成一个可以使用的端口是最好不过的。

在 Spring Boot 中,可以通过 ${random} 来生成随机数字,我们可以这样使用:

server.port=${random.int[2000,8000]}

 通过 random.int 方法,指定随机数的访问,生成一个在 2000 到 8000 之间的数字,

编写一个启动参数设置类,代码如下所示。

public class StartCommand {private Logger logger = LoggerFactory.getLogger(StartCommand.class);public StartCommand(String[] args) {Boolean isServerPort = false;String serverPort = "";if (args != null) {for (String arg : args) {if (StringUtils.hasText(arg) && arg.startsWith("--server.port")) {isServerPort = true;serverPort = arg;break;}}}// 没有指定端口, 则随机生成一个可用的端口if (!isServerPort) {int port = ServerPortUtils.getAvailablePort();logger.info("current server.port=" + port);System.setProperty("server.port", String.valueOf(port));} else {logger.info("current server.port=" + serverPort.split("=")[1]);System.setProperty("server.port", serverPort.split("=")[1]);}}
}

通过对启动参数进行遍历判断,如果有指定启动端口,后续就不自动生成了;如果没有指定,就通过 ServerPortUtils 获取一个可以使用的端口,然后设置到环境变量中。在 application.properties 中通过下面的方式获取端口:

server.port=${server.port}

关于获取可用端口的代码如下所示。

public static int getAvailablePort() {int max = 65535;int min = 2000;Random random = new Random();int port = random.nextInt(max)%(max-min+1) + min;boolean using = NetUtils.isLoclePortUsing(port);if (using) {return getAvailablePort();} else {return port;}
}

获取可用端口的主要逻辑是指定一个范围,然后生成随机数字,最后通过 NetUtils 来检查端口是否可用。如果获取到可用的端口则直接返回,没有获取到可用的端口则执行回调逻辑,重新获取。检测端口是否可用主要是用 Socket 来判断这个端口是否可以被链接。

最后在启动类中调用端口即可使用,代码如下所示。

public class FshHouseServiceApplication {public static void main(String[] args) {// 启动参数设置, 比如自动生成端口new StartCommand(args);SpringApplication.run(FshHouseServiceApplication.class, args);}
}

编译打包

传统的 Web 项目在部署的时候,是编译出一个 war 包放到 Tomcat 的 webapps 目录下。而在 Spring Boot 构建的 Web 项目中则打破了这一传统部署的方式,它采用更加简单的内置容器方式来部署应用程序,只需要将应用编译打包成一个 jar 包,直接可以通过 java–jar 命令启动应用。

在项目的 pom.xml 中增加打包的 Maven 插件,代码如下所示。

<build><plugins><!-- 打包插件 --><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><executable>true</executable><mainClass>net.biancheng.spring_boot_example.App</mainClass></configuration></plugin><!-- 编译插件, 指定JDK版本 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><target>1.8</target></configuration></plugin></plugins>
</build>

mainClass 配置的是我们的启动入口类,配置完成后可以通过 Maven 的 mvn clean package 命令进行编译打包操作。编译完成后在 target 目录下会生成对应的 jar 包,部署的时候直接调用 java–jar xx.jar 即可启动应用。

相关springboot实战项目推荐

基于java ssm springboot+VUE疫情防疫系统系统前后端分离设计和实现

基于java springboot+mybatis电影售票网站管理系统前台+后台设计和实现

基于java ssm springboot+mybatis酒庄内部管理系统设计和实现

基于JAVA springboot+mybatis智慧生活分享平台设计和实现

基于Java springboot+vue+redis前后端分离家具商城平台系统设计和实现

基于JAVA SSM springboot实现的抗疫物质信息管理系统设计和实现

查看更多首页实战项目 >>>

好了,今天就到这儿吧,小伙伴们点赞、收藏、评论,一键三连走起呀,下期见~~


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/562290.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《SpringCloud超级入门》Spring Boot Starter的介绍及使用《七》

目录 Spring Boot Starter项目创建 自动创建客户端 使用 Starter 使用注解开启 Starter 自动构建 使用配置开启 Starter 自动构建 配置 Starter 内容提示 Spring Boot 的便利性体现在&#xff0c;它简化了很多烦琐的配置&#xff0c;这对于开发人员来说是一个福音&#…

php 发送短信 sms,php 调用百度sms来发送短信的实现示例

BaiduSms百度云 sms php版本官方没有给出php版本的短信发送sdk, 在此借鉴 [ 点击这里 ]&#xff0c;并在此基础上将方法改成 单例模式 在原来的基础上更加容易调用1.打开 BaiduSms.php 修改 sms函数中 accessKey 、 secretAccessKey 这两个参数登录百度云账号&#xff0c;在右上…

《SpringCloud超级入门》Spring Cloud Eureka是什么?《八》

Spring cloud Eureka 是 Spring Cloud Netflix 微服务套件的一部分&#xff0c;基于 Netflix Eureka 做了二次封装&#xff0c;主要负责实现微服务架构中的服务治理功能。 Spring Cloud Eureka 是一个基于 REST 的服务&#xff0c;并且提供了基于 Java 的客户端组件&#xff0c…

php 常用编译参数,php编译参数,不用怕!!

很多初学者&#xff0c;在编译php的时候&#xff0c;容易被php的编译参数吓到&#xff01;例如&#xff1a;./configure \--prefix/usr/local/php \--with-config-file-path/usr/local/php/etc \--enable-inline-optimization \--disable-debug \--disable-rpath \--enable-sha…

《SpringCloud超级入门》使用Eureka编写注册中心服务《九》

首先创建一个 Maven项目&#xff0c;取名为 eureka-server&#xff0c;在 pom.xml 中配置 Eureka 的依赖信息&#xff0c;代码如下所示。 <!-- Spring Boot --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot…

php设置表单为整数,PHP中如何判断FROM表单提交的数字是否为整数?

在php开发中我们经常需要用表单传递数据&#xff0c;如果我们传递的是整数(int)&#xff0c;经过表单传递后&#xff0c;在接收页面整数的数值类型将会变成字符串(string)类型,这样我们就不能用is_int()函数来判断是否为整数&#xff0c;但是我们可以用is_numeric()和strpos()函…

《SpringCloud超级入门》使用Eureka编写服务提供者《十》

创建项目注册到 Eureka 将一个服务提供者 eureka-client-user-service 注册到 Eureka 中&#xff0c;并提供一个接口给其他服务调用。 创建一个 Maven 项目&#xff0c;在 pom.xml 中增加相关依赖 <parent> <groupId>org.springframework.boot</groupId> &l…

PHP苹果不给上架,苹果商城上架拒绝

苹果商城一直被拒绝&#xff0c;原因说是有支付宝支付功能&#xff0c;需要内购。但我配置中已经把支付宝支付功能去掉了&#xff0c;也勾上了应用内支付&#xff0c;但还是被拒绝&#xff0c;不知道什么原因&#xff0c;请问我该如何整改&#xff1f;是由于HBuilderX云打包默认…

《SpringCloud超级入门》使用Eureka编写服务消费者《十一》

我们先从 Nginx 说起&#xff0c;了解为什么需要微服务。最初的服务化解决方案是给相同服务提供一个统一的域名&#xff0c;然后服务调用者向这个域发送 HTTP 请求&#xff0c;由 Nginx 负责请求的分发和跳转。 这种架构存在很多问题&#xff1a;Nginx 作为中间层&#xff0c;在…

java echarts 散点图,echarts在地图上绘制散点图(任意点)

项目需求&#xff1a;在省份地图上绘制散点图&#xff0c;散点位置不一定是哪个城市或哪个区县&#xff0c;即任意点通过查询官网文档&#xff0c;找到一个与需求类似的Demo&#xff1a;https://www.echartsjs.com/gallery/editor.html?cscatter-map&#xff0c;更改代码&…

《SpringCloud超级入门》Eureka注册中心开启密码认证《十二》

Eureka 自带了一个 Web 的管理页面&#xff0c;方便我们查询注册到上面的实例信息&#xff0c;但是有一个问题&#xff1a;如果在实际使用中&#xff0c;注册中心地址有公网 IP 的话&#xff0c;必然能直接访问到&#xff0c;这样是不安全的。所以我们需要对 Eureka 进行改造&a…

php如何直接使用iview,iview 使用总结

vueiview 开发后台系统问题总结tags用了keep-alive 包裹 router-view,页面进行缓存点击tag可切换,不会重新渲染在特定页面比如详情页需要每次刷新的时候,添加watch $route 进行相关的刷新,导致了另外一个问题,最初跳转时用的 params传参,刷新参数就没了,特改为query传参.涉及到…

基于java+springboot+mybatis+laiyu实现学科竞赛管理系统《建议收藏》

&#x1f345; 作者主页&#xff1a;Java李杨勇 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java李杨勇公号作者✌ 简历模板、学习资料、面试题库、技术互助【关注我&#xff0c;都给你】 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f…

JAVA输出菱形并使用绝对值,案例用绝对值的方法打印出菱形

import java.util.Scanner;public class Test {public static void main(String[] args) {Scanner sc new Scanner(System.in);System.out.println("请输入菱形的层高(层高为奇数):");int num sc.nextInt();// 控制输入层高为奇数while (num % 2 0) {System.out.p…

基于java TCP实现网络通信聊天室《建议收藏附完整源码》

&#x1f345; 作者主页&#xff1a;Java李杨勇 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java李杨勇公号作者✌ 简历模板、学习资料、面试题库、技术互助【关注我&#xff0c;都给你】 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f…

mysql 获取年预提,【判断题】正确核算待摊费用和预提费用,有助于划分本期费用与非本期费用的界限。...

【判断题】正确核算待摊费用和预提费用,有助于划分本期费用与非本期费用的界限。更多相关问题[单选] 如果整条线组件压力突然升高&#xff0c;原因可能是()。[多选] 风机的常见故障有()。[单选] 侧吹风窗安装过程中应注意()。[判断题] 组件的压力波动会影响产品的质量。[单选] …

《零基础》MySQL 正则表达式(二十一)

MySQL中使用 REGEXP 操作符来进行正则表达式匹配。 实例操作 查找name字段中以st为开头的所有数据&#xff1a; SELECT name FROM person_tbl WHERE name REGEXP ^st; 查找name字段中以ok为结尾的所有数据&#xff1a; SELECT name FROM person_tbl WHERE name REGEXP ok$;…

ORACLE 12C采坑之 ORA-12541:TNS:无监听程序

目录 1.首先查看oracle12c监听服务是否启动 2. ping 本地id是否能ping通 3.检测配置监听是否有错误: 4.重新配置监听器Net Configuration Assistant 5.之后重启OracleServiceORCL服务 1.首先查看oracle12c监听服务是否启动 2. ping 本地id是否能ping通 3.检测配置监听是否…

无重复字符的最长子串php,LeetCode - 无重复字符的最长子串 - Golang

题目&#xff1a;给定一个字符串&#xff0c;请你找出其中不含有重复字符的 最长子串的长度。示例 1:输入: "abcabcbb"输出: 3解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。示例 2:输入: "bbbbb"输出: 1解释: 因为无重复…

《SpringCloud超级入门》使用Eureka集群搭建《十三》

前面我们搭建的注册中心只适合本地开发使用&#xff0c;在生产环境中必须搭建一个集群来保证高可用。Eureka 的集群搭建方法很简单&#xff1a;每一台 Eureka 只需要在配置中指定另外多个 Eureka 的地址就可以实现一个集群的搭建了。 以 2 个节点为例来说明搭建方式。假设我们有…