Spring Boot 1.5作为一个革命性的框架,极大地简化了Spring应用的开发流程。本文将详细介绍Spring Boot 1.5的核心特性和微服务开发最佳实践。
1. 项目配置
1.1 基础配置
1
2
3
4
5
6
7
8
9
10
11
12
13
<!-- pom.xml -->
<parent>
<groupId> org.springframework.boot</groupId>
<artifactId> spring-boot-starter-parent</artifactId>
<version> 1.5.10.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId> org.springframework.boot</groupId>
<artifactId> spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
1.2 应用配置
1
2
3
4
5
6
7
8
9
10
11
12
# application.yml
spring :
application :
name : user-service
datasource :
url : jdbc:mysql://localhost:3306/userdb
username : root
password : password
driver-class-name : com.mysql.jdbc.Driver
server :
port : 8080
2. RESTful API开发
2.1 控制器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@RestController
@RequestMapping ( "/api/users" )
public class UserController {
@Autowired
private UserService userService ;
@GetMapping ( "/{id}" )
public ResponseEntity < User > getUser ( @PathVariable Long id ) {
return ResponseEntity . ok ( userService . findById ( id ));
}
@PostMapping
public ResponseEntity < User > createUser ( @RequestBody User user ) {
return ResponseEntity . status ( HttpStatus . CREATED )
. body ( userService . create ( user ));
}
}
2.2 异常处理
1
2
3
4
5
6
7
8
9
10
11
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler ( UserNotFoundException . class )
public ResponseEntity < ErrorResponse > handleUserNotFound ( UserNotFoundException ex ) {
ErrorResponse error = new ErrorResponse (
HttpStatus . NOT_FOUND . value (),
ex . getMessage ()
);
return new ResponseEntity <> ( error , HttpStatus . NOT_FOUND );
}
}
3. 数据访问
3.1 JPA配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Entity
@Table ( name = "users" )
public class User {
@Id
@GeneratedValue ( strategy = GenerationType . IDENTITY )
private Long id ;
@Column ( nullable = false )
private String username ;
@Column ( nullable = false )
private String email ;
// getters and setters
}
@Repository
public interface UserRepository extends JpaRepository < User , Long > {
Optional < User > findByUsername ( String username );
List < User > findByEmailContaining ( String email );
}
3.2 事务管理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Service
@Transactional
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository ;
@Override
public User create ( User user ) {
validateUser ( user );
return userRepository . save ( user );
}
@Transactional ( readOnly = true )
@Override
public User findById ( Long id ) {
return userRepository . findById ( id )
. orElseThrow (() -> new UserNotFoundException ( id ));
}
}
4. 安全配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure ( HttpSecurity http ) throws Exception {
http . csrf (). disable ()
. authorizeRequests ()
. antMatchers ( "/api/public/**" ). permitAll ()
. anyRequest (). authenticated ()
. and ()
. httpBasic ();
}
@Autowired
public void configureGlobal ( AuthenticationManagerBuilder auth )
throws Exception {
auth . userDetailsService ( userDetailsService )
. passwordEncoder ( passwordEncoder ());
}
@Bean
public PasswordEncoder passwordEncoder () {
return new BCryptPasswordEncoder ();
}
}
5. 缓存配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@Configuration
@EnableCaching
public class CacheConfig {
@Bean
public CacheManager cacheManager () {
SimpleCacheManager cacheManager = new SimpleCacheManager ();
cacheManager . setCaches ( Arrays . asList (
new ConcurrentMapCache ( "users" ),
new ConcurrentMapCache ( "roles" )
));
return cacheManager ;
}
}
@Service
public class CachedUserService {
@Cacheable ( value = "users" , key = "#id" )
public User findById ( Long id ) {
return userRepository . findById ( id )
. orElseThrow (() -> new UserNotFoundException ( id ));
}
@CacheEvict ( value = "users" , key = "#user.id" )
public void update ( User user ) {
userRepository . save ( user );
}
}
6. 异步处理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Configuration
@EnableAsync
public class AsyncConfig implements AsyncConfigurer {
@Override
public Executor getAsyncExecutor () {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor ();
executor . setCorePoolSize ( 5 );
executor . setMaxPoolSize ( 10 );
executor . setQueueCapacity ( 25 );
executor . initialize ();
return executor ;
}
}
@Service
public class EmailService {
@Async
public Future < Boolean > sendEmail ( String to , String subject ) {
// 异步发送邮件
return new AsyncResult <> ( true );
}
}
7. 监控和度量
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Configuration
public class ActuatorConfig {
@Bean
public HealthIndicator customHealthIndicator () {
return new HealthIndicator () {
@Override
public Health health () {
return Health . up ()
. withDetail ( "customKey" , "customValue" )
. build ();
}
};
}
}
# application . yml
management :
security :
enabled : false
endpoints :
web :
exposure :
include : "*"
8. 测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@RunWith ( SpringRunner . class )
@SpringBootTest ( webEnvironment = WebEnvironment . RANDOM_PORT )
public class UserControllerTest {
@Autowired
private TestRestTemplate restTemplate ;
@Test
public void testCreateUser () {
User user = new User ( "test" , "test@example.com" );
ResponseEntity < User > response = restTemplate . postForEntity (
"/api/users" , user , User . class );
assertThat ( response . getStatusCode ())
. isEqualTo ( HttpStatus . CREATED );
assertThat ( response . getBody (). getUsername ())
. isEqualTo ( "test" );
}
}
最佳实践建议
使用YAML代替Properties文件配置
合理使用Profile管理不同环境
统一异常处理
实现优雅停机
使用Spring Boot Actuator进行监控
性能优化技巧
连接池配置
1
2
3
4
5
6
spring :
datasource :
hikari :
maximum-pool-size : 10
minimum-idle : 5
idle-timeout : 300000
缓存策略优化
1
2
3
4
5
@Cacheable ( value = "users" , key = "#id" , unless = "#result == null" )
public User findById ( Long id ) {
return userRepository . findById ( id )
. orElse ( null );
}
总结
Spring Boot 1.5通过自动配置和约定优于配置的理念,大大简化了Spring应用的开发。通过合理使用其提供的特性,我们可以快速构建出高质量的微服务应用。建议开发团队制定统一的开发规范,并在实践中不断优化和改进。
Licensed under CC BY-NC-SA 4.0