spring boot 1.3 news #渋谷java
TRANSCRIPT
Spring Boot 1.3 News earlier than anywhere else
Shibuya-Java 2015-08-01 @making (Toshiaki Maki)
About me
• @making
• Spring enthusiast/contributor
Spring Boot
http://blog.pivotal.io/pivotal-cloud-foundry/features/mapping-the-cloud-native-journey
Spring Boot
http://blog.pivotal.io/pivotal-cloud-foundry/features/mapping-the-cloud-native-journey
1.4 M Downloads a month!!!
Spring Boot 1.3!
will be released @ 2015-09Current version is 1.3.0.RC2
Quick Start with Spring Initializer w/ STS
Quick Start with Spring Initializer w/ STS
Quick Start with Spring Initializer w/ IDEA
Quick Start with Spring Initializer w/ IDEA
• Spring 4.2 Support
• New AutoConfigures
• Non-functionalities
• DevOps
Highlights of Spring Boot 1.3
https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-1.3-Release-Notes
Today’s Demo Sources
https://github.com/making/demo-spring-boot-1.3
• Spring 4.2 Support
• New AutoConfigures
• Non-functionalities
• DevOps
Highlights of Spring Boot 1.3
Spring 4.2 Support• Server Sent Event (SSE)
• Cross Origin Resource Sharing (CORS)
• ScriptEngineView
• CompletableFuture
• and so on…Released Yesterday!
https://spring.io/blog/2015/07/31/spring-framework-4-2-goes-ga
• Spring 4.2 Support
• New AutoConfigures
• Non-functionalities
• DevOps
Highlights of Spring Boot 1.3
New AutoConfigures• Cache
•OAuth2
• Spring Session
• jOOQ
• EmbeddedMongoDB
CacheAutoConfigure for Spring Cache Abstraction
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId>
</dependency>
Cache@EnableCaching @SpringBootApplication @RestController public class Demo { @Autowired WeatherService service; @RequestMapping String hello() { long start = System.currentTimeMillis(); String result = service.getWeather("Tokyo"); long elapsed = System.currentTimeMillis() - start; return result + " took " + elapsed + " [ms]"; } public static void main(String[] args) { SpringApplication.run(Demo.class, args); } }
Cache@CacheConfig(cacheNames = "weather") @Service class WeatherService { @Cacheable public String getWeather(String where) { // Access OpenWeatherMap API; } }
Cache@CacheDefaults(cacheName = "weather") @Service class WeatherService { @CacheResult public String getWeather(String where) { // Access OpenWeatherMap API; } } Standard JCache API
is also available
Cache
Cache Managers•ConcurrentHashMap •EhCache •Hazelcast •Infinispan •JCache (JSR 107) •Redis •Guava
See Samples https://github.com/making/demo-spring-boot-1.3
https://blog.ik.am/#/entries/339
OAuth2AutoConfigure for Spring Security OAuth2
<dependency> <groupId>org.springframework.security.oauth</groupId> <artifactId>spring-security-oauth2</artifactId> </dependency>
OAuth2@SpringBootApplication
@RestControllerpublic class Demo { @RequestMapping("/") String hello() { return "Hello World!"; } public static void main(String[] args) { SpringApplication.run(Demo.class, args); }}
OAuth2@SpringBootApplication@EnableAuthorizationServer@EnableResourceServer@RestControllerpublic class Demo { @RequestMapping("/") String hello() { return "Hello World!"; } public static void main(String[] args) { SpringApplication.run(Demo.class, args); }}
security.user.name=usersecurity.user.password=passwordsecurity.oauth2.client.client-id=foosecurity.oauth2.client.client-secret=bar
OAuth2$ curl localhost:8080{ "error": "unauthorized", "error_description": "Full authentication is required to access this resource"}
OAuth2
$ curl foo:bar@localhost:8080/oauth/token -d grant_type=password -d username=user -d password=password -d scope=read{ "access_token": "43a001d3-862f-4f02-a60f-b04d0988c24c", "token_type": "bearer", "refresh_token": "e4af4aac-eb8e-423b-b3a9-a73ba0f81fd1", "expires_in": 43199, "scope": "read"}
Client ID/Secret Resource Owner’s username/password
OAuth2
$ curl -H "Authorization: Bearer 43a001d3-862f-4f02-a60f-b04d0988c24c" localhost:8080Hello World!
OAuth2 SSO@SpringBootApplication@EnableOAuthSso@RestControllerpublic class Demo { @RequestMapping("/") String hello(OAuth2Authentication auth) { return "Hello " + auth.getName(); } public static void main(String[] args) { SpringApplication.run(Demo.class, args); }}
OAuth2 SSOsecurity.oauth2.client.client-id=5f6623be1882438a166a security.oauth2.client.client-secret=fb38ecb19304645292ace4e3cfc8ba3102c44dc8security.oauth2.client.access-token-uri=https://github.com/login/oauth/access_token security.oauth2.client.user-authorization-uri=https://github.com/login/oauth/authorize security.oauth2.client.client-authentication-scheme=form security.oauth2.resource.user-info-uri=https://api.github.com/user security.oauth2.resource.prefer-token-info=false
OAuth2 SSO
OAuth2 SSOsecurity.oauth2.client.client-id=746653690954-hheiimv40v167fp6f26g security.oauth2.client.client-secret=jo7Ee9oHJY2i9DeOWHXuMcD- security.oauth2.client.access-token-uri=https://www.googleapis.com/oauth2/v3/token security.oauth2.client.user-authorization-uri=https://accounts.google.com/o/oauth2/auth security.oauth2.client.client-authentication-scheme=form security.oauth2.client.scope=profile,email security.oauth2.resource.user-info-uri=https://www.googleapis.com/plus/v1/people/me security.oauth2.resource.prefer-token-info=false
Goole+ API is also available!!
OAuth2 SSO
jOOQAutoConfigure for jOOQ
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jooq</artifactId> </dependency>
jOOQ@Repository public class CustomerRepository { @Autowired DSLContext dslContext; public List<Customer> findAll() { return dslContext.select() .from(CUSTOMERS) .orderBy(CUSTOMERS.FIRST_NAME.asc()) .fetchInto(Customer.class); } }
AutoConfigured
Exception Handler, TransactionManager… are also configured
Spring SessionAutoConfigure for Spring Session
<dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session</artifactId> </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis</artifactId> </dependency>
Spring Session@SpringBootApplication@RestControllerpublic class Demo { @Value("${server.port:8080}") int port;
@RequestMapping("/") String hello(HttpSession session) { return "port=" + port + ", id=" + session.getId(); } public static void main(String[] args) { SpringApplication.run(Demo.class, args); }}
Nothing special!
Spring Session
$ java -jar demo.jar --server.port=8080
$ java -jar demo.jar --server.port=8081
Spring Session
Spring Session
Spring Session
EmbeddedMongoDBAutoConfigure for Embedded Mongo
<dependency> <groupId>de.flapdoodle.embed</groupId> <artifactId>de.flapdoodle.embed.mongo</artifactId> </dependency>
Automatically used
• Spring 4.2 Support
• New AutoConfigures
• Non-functionalities
• DevOps
Highlights of Spring Boot 1.3
Non-functionalities
• OpenTSDB Metrics Writer
• StatsD Metrics Writer
• New Healthcheck
OpenTSDB Metrics Writer
@Bean@ExportMetricWriter@ConfigurationProperties("metrics.export")MetricWriter metricWriter() { return new OpenTsdbMetricWriter();}
metrics.export.url=http://localhost:4242/api/put
Export metrics to
StatsD Metrics Writer
Export metrics to StatsD
@Bean @ExportMetricWriter MetricWriter metricWriter(@Value("${statsd.prefix}") String prefix, @Value("${statsd.host}") String host, @Value("${statsd.port}") int port) { return new StatsdMetricWriter(prefix, host, port); }
statsd.prefix=demostatsd.host=localhoststatsd.port=8125
StatsD Metrics Writer
StatsD + Graphite + Grafana
https://github.com/kamon-io/docker-grafana-graphite
New Health Check
• Elasticsearch
• JMS
Highlights of Spring Boot 1.3
• Spring 4.2 Support
• New AutoConfigures
• Non-functionalities
• DevOps
DevOps
• Ascii Color Banner
• Systemd Service
• DevTools
Ascii Color Banner${AnsiColor.BRIGHT_GREEN}My Application${AnsiColor.BRIGHT_YELLOW}Hello!!${AnsiColor.DEFAULT}
src/main/resources/banner.txt
Ascii Color Banner
Systemd Service
$ mvn package$ cp target/*.jar /var/demo/demo
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <executable>true</executable> </configuration> </plugin>
Systemd Service
$ systemctl start demo$ systemctl enable demo
[Unit]Description=demoAfter=syslog.target[Service]ExecStart=/var/demo/demo[Install]WantedBy=multi-user.target
/etc/systemd/system/demo.service
DevTools• Disabling template cache
• Auto restart Class Loader
• Live reload browser
• Remote debug & restart
DevTools
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId></dependency>
Disabling template cache
spring.thymeleaf.cache=falsespring.freemarker.cache=falsespring.groovy.template.cache=falsespring.velocity.cache=falsespring.mustache.cache=false
spring.thymeleaf.cache=falsespring.freemarker.cache=falsespring.groovy.template.cache=falsespring.velocity.cache=falsespring.mustache.cache=false
No longer needed!!
Disabling template cache
Live reload browser
Demo
Remote debug & restart
https://www.youtube.com/watch?v=A70NMxV13TI
Wrap UpSpring 4.2
• Server-Sent Events • CORS • ScriptEngineView • CompletableFuture
New AutoConfigures • Cache • OAuth2 • Spring Session • jOOQ
Non-functionalities • OpenTSDB Metrics • StatsD Metrics • New Healthcheck
DevOps • Ascii Color Banner • Systemd Service • DevTools
Announce!!
• Spring in Summer
• 2015-08-28(Fri.)09:30 - 18:30
• GranTokyo South Towerhttps://jsug.doorkeeper.jp/events/27682
Largest Spring Event in Japan!!
Announce!!
• JJUG LT Festival!!
• 2015-08-10(Mon.)19:00 - 21:00
https://jjug.doorkeeper.jp/events/28181