学习Spring Cloud与微服务之路三

一、开发环境的准备
开发环境的准备主要涉及三个方面:JDK、Maven、Spring Tools 4 for Eclipse

1、JDK
JDK的版本用1.8即可,具体安装请看这篇文章

2、Maven
Maven是用于项目构建的,具体安装请看 这篇文章

3、Spring Tools 4 to Eclipse
Spring Tools 4是一个Spring开发的IDE工具,具体安装请看 这篇文章

关于lombok插件的安装,采用lombok来简化 get、set方法,安装请看 这篇文章

二、Spring Boot 入门
Spring Cloud基于Spring Boot搭建的,Spring Boot开发的优点:
基于Spring开发web应用更加容易
采用基于注解方式的配置,避免了编写大量重复的XML配置
可以轻松集成Spring家族的其他框架,比如Spring JDBC、Spring Data等
提供嵌入式服务器,令开发和部署变得非常方便

三、搭建Spring Boot项目
在Spring tool4中依次选择Filte–>New—>Maven Project,然后在出现的界面中按下图所示增加相关信息
在这里插入图片描述
Spring Boot依赖配置

org.springframework.boot
spring-boot-starter-parent
2.3.4.RELEASE

org.springframework.boot spring-boot-starter-web

Spring Boot启动类

@SpringBootApplication
public class DemoApplication {

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

}

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

在这里插入图片描述
四、编写一个REST接口
REST接口
@RestController是@Controller和@ResponseBody的组合注解,可以直接返回Json格式数据。@GetMapping是@RequestMapping(method=RequestMethod.GET)

@RestController
public class HelloController {

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

}

端口号可以在application.properties可以设置端口号,默认端口号是8080,也可以在application.properties设置 server.port=8014
在这里插入图片描述
五、读取配置文件
Spring Boot中的配置是放在application.properties中,读取配置信息非常方便,总共分为3种方式
1、Environment:可以通过Environment的getProperty方法来获取想要的配置信息

@RestController
public class HelloController {

@Autowired
private Environment  env;

@GetMapping("/hello")
public String hello() {
	String str = env.getProperty("server.port");
	return str;
}

}

2、@Value : 可以注入具体的配置信息

@RestController
public class HelloController {

@Autowired
private Environment  env;

@Value("${server.port}")
private String port;

@GetMapping("/hello")
public String hello() {
	String str = env.getProperty("server.port");
	return str + " - " + port;
}

}

3、自定义配置类 : prefix定义配置的前缀

这里想要在pom.xml引入如下依赖

org.springframework.boot
spring-boot-configuration-processor
true

@ConfigurationProperties(prefix = “com.test”)
@Component
public class MyConfig {

private String password;

public String getPassword() {
	return password;
}

public void setPassword(String password) {
	this.password = password;
}

}

执行配置读取
@RestController
public class HelloController {

@Autowired
private Environment  env;

@Autowired
private MyConfig myConfig;

@Value("${server.port}")
private String port;

@GetMapping("/hello")
public String hello() {
	String str = env.getProperty("server.port");
	return str + " - " + port + " - " + myConfig.getPassword();
}

}

在定义配置文件中 application.properties 的方法如下
在这里插入图片描述
六、profiles多环境配置
在Spring Boot中可以通过spring.profiles.active=dev 来激活不同环境下的配置,可以定义多个配置文件,每个配置文件对应的一个环境,格式为application-环境.properties
在这里插入图片描述
在开发环境中,可以通过修改application.properties中spring.profiles.active的值来激活对应环境的配置,在部署的时候可以通过 java-jar xxx.jar --spring.profiles.active=dev来指定使用对应的配置。

七、热部署
热部署通过spring-boot-devtools就可以实现,在添加spring-boot-devtools的依赖即可实现热部署功能
在这里插入图片描述
八、actuator监控
Spring Boot提供了一个用于监控和管理自身应用信息的模块(spring-boot-starter-actuator)
在pom.xml文件中添加相应的依赖包
在这里插入图片描述
可以通过下面的这些Actuator模块提供的端点信息,可以获取很多监控信息
在这里插入图片描述PS:spring boot自带的健康指示器
在这里插入图片描述

比如访问http://localhost:8014/actuator 可以看到当前actuator模块下所有的监控类型请求
在这里插入图片描述
同时也可以设置权限控制,用于访问actuator模块的请求,想要通过用户登录认证之后才能调用,要在配置文件application.properties,在pom.xml文件中引入spring-boot-starter-security

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

up表示当前应用处于健康状态,如果是down就表示当前应用不健康,可以增加配置来查看健康信息的详情,在application.properties中

#配置可以显示监控的健康详细信息
management.endpoint.health.show-details=ALWAYS
在这里插入图片描述

也可以配置端点的暴露,大部分都是默认不暴露的,可以通过这个手动配置来实现要暴露的端点
#配置暴露部分端点,用逗号分隔,如果要全部暴露,则似乎用 *
management.endpoints.web.exposure.include=*

九、自定义actuator端点
1、在对应用的健康状态增加一些其他维度的数据,可以通过继承AbstractHealthIndicator来实现自己的业务逻辑

@Component
public class UserHealthIndicator extends AbstractHealthIndicator {

@Override
protected void doHealthCheck(Builder builder) throws Exception {
	builder.withDetail("status", false);
	
}

}

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

在这里插入图片描述
2、自定义全新的端点很简单,通过@Endpoint注解就可以实现

@Component
@Endpoint(id=“user”)
public class UserEndpoint {

@ReadOperation
public 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", "hello");
	list.add(map);
	return list;
}

}

执行http://localhost:8014/actuator/user,可以获取如下执行结果
在这里插入图片描述
十、统一异常处理
1、自定义统一的异常处理类,其中的ResponeseData是自定义的返回格式的实体类,其发生错误时也会捕获到,然后封装好返回格式
@ControllerAdvice
public class GlobalExceptionHandler {

private Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);

@ExceptionHandler(value=Exception.class)
@ResponseBody
public ResponseData defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception{
	log.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;
}

}

2、需要在Spring Boot的配置文件中添加异常处理配置

在这里插入图片描述
在使用调用不存在的接口时候,返回的参数
在这里插入图片描述
十一、异步执行
1、传统多线程使用方式
在这里插入图片描述
2、@Async使用方式
想要啊简单的方式来执行异步操作,只需要一个@Async注解即可,在Controller中调用这个业务方法,会在默认的线程池中去执行,注意一定要在外部的类中去调用这个方法,如果在本类调用则不起作用,比如
this.saveLog(),最后在启动类上开启异步任务的执行,添加@EnableAsync

@Component //把普通pojo实例化到spring容器中
public class UserAsync {

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

}
3、自定义线程池

先配置线程池参数配置类

在这里插入图片描述
然后再重新定义线程池的配置,配置完之后需要配置文件中配置线程池的大小等信息,默认的配置是

#配置线程池的大小
spring.task.pool.maxPoolSize=100

在这里插入图片描述
关于线程池配置的拒绝策略,当线程池数量高于线程池的处理速度时,任务会被缓存到本地的队列中,队列是有小的,如果超过了这个大小,就需要拒绝的策略,不然就会出现内存溢出,目前支持的两种拒绝策略:
1)、AbortPolicy : 直接抛出java.util.concurrent.RejectedExceutionException异常
2)、CallerRunsPolicy : 主线程直接执行该任务,执行完之后尝试添加下一个任务到线程池中,这样可以有效降低向线程池内添加任务的速度。
PS:建议使用CallerRunsPolicy策略,因为队列中的任务满了之后,如果直接抛出异常,那么这个任务就会被丢弃;如果是CallerRunsPolicy策略,则会用主线程去执行,也就是同步执行,这样操作最起码任务不会被丢弃。

十二、随机端口
编写一个启动参数设置类

在这里插入图片描述

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

获取可用端口的代码
在这里插入图片描述
获取可用的端口的主要逻辑是指定一个范围,然后生成随机数字,通过NetUtils检查端口是否可用,如果获取到可用的端口则直接返回,没有获取到可用的端口则执行回调逻辑,重新获取,检测端口是否可用主要是用socket来判断这个端口是否可用被链接
在这里插入图片描述

©️2020 CSDN 皮肤主题: 护眼 设计师:闪电赇 返回首页