Skip to content

Commit 2af778c

Browse files
Merge pull request digitalsonic#12 from digitalsonic/master
课程
2 parents cb68f3a + 413c1b6 commit 2af778c

File tree

58 files changed

+1676
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

58 files changed

+1676
-0
lines changed
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
HELP.md
2+
/target/
3+
!.mvn/wrapper/maven-wrapper.jar
4+
5+
### STS ###
6+
.apt_generated
7+
.classpath
8+
.factorypath
9+
.project
10+
.settings
11+
.springBeans
12+
.sts4-cache
13+
14+
### IntelliJ IDEA ###
15+
.idea
16+
*.iws
17+
*.iml
18+
*.ipr
19+
20+
### NetBeans ###
21+
/nbproject/private/
22+
/nbbuild/
23+
/dist/
24+
/nbdist/
25+
/.nb-gradle/
26+
/build/
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4+
<modelVersion>4.0.0</modelVersion>
5+
<parent>
6+
<groupId>org.springframework.boot</groupId>
7+
<artifactId>spring-boot-starter-parent</artifactId>
8+
<version>2.1.3.RELEASE</version>
9+
<relativePath/> <!-- lookup parent from repository -->
10+
</parent>
11+
<groupId>geektime.spring.springbucks</groupId>
12+
<artifactId>customer-service</artifactId>
13+
<version>0.0.1-SNAPSHOT</version>
14+
<name>customer-service</name>
15+
<description>Demo project for Spring Boot</description>
16+
17+
<properties>
18+
<java.version>1.8</java.version>
19+
</properties>
20+
21+
<dependencies>
22+
<dependency>
23+
<groupId>org.springframework.boot</groupId>
24+
<artifactId>spring-boot-starter-web</artifactId>
25+
</dependency>
26+
27+
<dependency>
28+
<groupId>org.joda</groupId>
29+
<artifactId>joda-money</artifactId>
30+
<version>1.0.1</version>
31+
</dependency>
32+
33+
<dependency>
34+
<groupId>org.apache.commons</groupId>
35+
<artifactId>commons-lang3</artifactId>
36+
</dependency>
37+
38+
<dependency>
39+
<groupId>org.apache.httpcomponents</groupId>
40+
<artifactId>httpclient</artifactId>
41+
<version>4.5.7</version>
42+
</dependency>
43+
44+
<dependency>
45+
<groupId>org.projectlombok</groupId>
46+
<artifactId>lombok</artifactId>
47+
<optional>true</optional>
48+
</dependency>
49+
<dependency>
50+
<groupId>org.springframework.boot</groupId>
51+
<artifactId>spring-boot-starter-test</artifactId>
52+
<scope>test</scope>
53+
</dependency>
54+
</dependencies>
55+
56+
<build>
57+
<plugins>
58+
<plugin>
59+
<groupId>org.springframework.boot</groupId>
60+
<artifactId>spring-boot-maven-plugin</artifactId>
61+
</plugin>
62+
</plugins>
63+
</build>
64+
65+
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
package geektime.spring.springbucks.customer;
2+
3+
import geektime.spring.springbucks.customer.model.Coffee;
4+
import geektime.spring.springbucks.customer.support.CustomConnectionKeepAliveStrategy;
5+
import lombok.extern.slf4j.Slf4j;
6+
import org.apache.http.impl.client.CloseableHttpClient;
7+
import org.apache.http.impl.client.HttpClients;
8+
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
9+
import org.joda.money.CurrencyUnit;
10+
import org.joda.money.Money;
11+
import org.springframework.beans.factory.annotation.Autowired;
12+
import org.springframework.boot.ApplicationArguments;
13+
import org.springframework.boot.ApplicationRunner;
14+
import org.springframework.boot.Banner;
15+
import org.springframework.boot.WebApplicationType;
16+
import org.springframework.boot.autoconfigure.SpringBootApplication;
17+
import org.springframework.boot.builder.SpringApplicationBuilder;
18+
import org.springframework.boot.web.client.RestTemplateBuilder;
19+
import org.springframework.context.annotation.Bean;
20+
import org.springframework.core.ParameterizedTypeReference;
21+
import org.springframework.http.HttpMethod;
22+
import org.springframework.http.MediaType;
23+
import org.springframework.http.RequestEntity;
24+
import org.springframework.http.ResponseEntity;
25+
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
26+
import org.springframework.web.client.RestTemplate;
27+
import org.springframework.web.util.UriComponentsBuilder;
28+
29+
import java.net.URI;
30+
import java.time.Duration;
31+
import java.util.List;
32+
import java.util.concurrent.TimeUnit;
33+
34+
@SpringBootApplication
35+
@Slf4j
36+
public class CustomerServiceApplication implements ApplicationRunner {
37+
@Autowired
38+
private RestTemplate restTemplate;
39+
40+
public static void main(String[] args) {
41+
new SpringApplicationBuilder()
42+
.sources(CustomerServiceApplication.class)
43+
.bannerMode(Banner.Mode.OFF)
44+
.web(WebApplicationType.NONE)
45+
.run(args);
46+
}
47+
48+
@Bean
49+
public HttpComponentsClientHttpRequestFactory requestFactory() {
50+
PoolingHttpClientConnectionManager connectionManager =
51+
new PoolingHttpClientConnectionManager(30, TimeUnit.SECONDS);
52+
connectionManager.setMaxTotal(200);
53+
connectionManager.setDefaultMaxPerRoute(20);
54+
55+
CloseableHttpClient httpClient = HttpClients.custom()
56+
.setConnectionManager(connectionManager)
57+
.evictIdleConnections(30, TimeUnit.SECONDS)
58+
.disableAutomaticRetries()
59+
// 有 Keep-Alive 认里面的值,没有的话永久有效
60+
//.setKeepAliveStrategy(DefaultConnectionKeepAliveStrategy.INSTANCE)
61+
// 换成自定义的
62+
.setKeepAliveStrategy(new CustomConnectionKeepAliveStrategy())
63+
.build();
64+
65+
HttpComponentsClientHttpRequestFactory requestFactory =
66+
new HttpComponentsClientHttpRequestFactory(httpClient);
67+
68+
return requestFactory;
69+
}
70+
71+
@Bean
72+
public RestTemplate restTemplate(RestTemplateBuilder builder) {
73+
// return new RestTemplate();
74+
75+
return builder
76+
.setConnectTimeout(Duration.ofMillis(100))
77+
.setReadTimeout(Duration.ofMillis(500))
78+
.requestFactory(this::requestFactory)
79+
.build();
80+
}
81+
82+
@Override
83+
public void run(ApplicationArguments args) throws Exception {
84+
URI uri = UriComponentsBuilder
85+
.fromUriString("http://localhost:8080/coffee/?name={name}")
86+
.build("mocha");
87+
RequestEntity<Void> req = RequestEntity.get(uri)
88+
.accept(MediaType.APPLICATION_XML)
89+
.build();
90+
ResponseEntity<String> resp = restTemplate.exchange(req, String.class);
91+
log.info("Response Status: {}, Response Headers: {}", resp.getStatusCode(), resp.getHeaders().toString());
92+
log.info("Coffee: {}", resp.getBody());
93+
94+
String coffeeUri = "http://localhost:8080/coffee/";
95+
Coffee request = Coffee.builder()
96+
.name("Americano")
97+
.price(Money.of(CurrencyUnit.of("CNY"), 25.00))
98+
.build();
99+
Coffee response = restTemplate.postForObject(coffeeUri, request, Coffee.class);
100+
log.info("New Coffee: {}", response);
101+
102+
ParameterizedTypeReference<List<Coffee>> ptr =
103+
new ParameterizedTypeReference<List<Coffee>>() {};
104+
ResponseEntity<List<Coffee>> list = restTemplate
105+
.exchange(coffeeUri, HttpMethod.GET, null, ptr);
106+
list.getBody().forEach(c -> log.info("Coffee: {}", c));
107+
}
108+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package geektime.spring.springbucks.customer.model;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Data;
6+
import lombok.NoArgsConstructor;
7+
import org.joda.money.Money;
8+
9+
import java.io.Serializable;
10+
import java.util.Date;
11+
12+
@Data
13+
@Builder
14+
@NoArgsConstructor
15+
@AllArgsConstructor
16+
public class Coffee implements Serializable {
17+
private Long id;
18+
private String name;
19+
private Money price;
20+
private Date createTime;
21+
private Date updateTime;
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package geektime.spring.springbucks.customer.support;
2+
3+
import org.apache.commons.lang3.StringUtils;
4+
import org.apache.commons.lang3.math.NumberUtils;
5+
import org.apache.http.HttpResponse;
6+
import org.apache.http.conn.ConnectionKeepAliveStrategy;
7+
import org.apache.http.protocol.HTTP;
8+
import org.apache.http.protocol.HttpContext;
9+
10+
import java.util.Arrays;
11+
12+
public class CustomConnectionKeepAliveStrategy implements ConnectionKeepAliveStrategy {
13+
private final long DEFAULT_SECONDS = 30;
14+
15+
@Override
16+
public long getKeepAliveDuration(HttpResponse response, HttpContext context) {
17+
return Arrays.asList(response.getHeaders(HTTP.CONN_KEEP_ALIVE))
18+
.stream()
19+
.filter(h -> StringUtils.equalsIgnoreCase(h.getName(), "timeout")
20+
&& StringUtils.isNumeric(h.getValue()))
21+
.findFirst()
22+
.map(h -> NumberUtils.toLong(h.getValue(), DEFAULT_SECONDS))
23+
.orElse(DEFAULT_SECONDS) * 1000;
24+
}
25+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package geektime.spring.springbucks.customer.support;
2+
3+
import com.fasterxml.jackson.core.JsonParser;
4+
import com.fasterxml.jackson.core.JsonProcessingException;
5+
import com.fasterxml.jackson.databind.DeserializationContext;
6+
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
7+
import org.joda.money.CurrencyUnit;
8+
import org.joda.money.Money;
9+
import org.springframework.boot.jackson.JsonComponent;
10+
11+
import java.io.IOException;
12+
13+
@JsonComponent
14+
public class MoneyDeserializer extends StdDeserializer<Money> {
15+
protected MoneyDeserializer() {
16+
super(Money.class);
17+
}
18+
19+
@Override
20+
public Money deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
21+
return Money.of(CurrencyUnit.of("CNY"), p.getDecimalValue());
22+
}
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package geektime.spring.springbucks.customer.support;
2+
3+
import com.fasterxml.jackson.core.JsonGenerator;
4+
import com.fasterxml.jackson.databind.SerializerProvider;
5+
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
6+
import org.joda.money.Money;
7+
import org.springframework.boot.jackson.JsonComponent;
8+
9+
import java.io.IOException;
10+
11+
@JsonComponent
12+
public class MoneySerializer extends StdSerializer<Money> {
13+
protected MoneySerializer() {
14+
super(Money.class);
15+
}
16+
17+
@Override
18+
public void serialize(Money money, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
19+
jsonGenerator.writeNumber(money.getAmount());
20+
}
21+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package geektime.spring.springbucks.customer;
2+
3+
import org.junit.Test;
4+
import org.junit.runner.RunWith;
5+
import org.springframework.boot.test.context.SpringBootTest;
6+
import org.springframework.test.context.junit4.SpringRunner;
7+
8+
@RunWith(SpringRunner.class)
9+
@SpringBootTest
10+
public class CustomerServiceApplicationTests {
11+
12+
@Test
13+
public void contextLoads() {
14+
}
15+
16+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
HELP.md
2+
/target/
3+
!.mvn/wrapper/maven-wrapper.jar
4+
5+
### STS ###
6+
.apt_generated
7+
.classpath
8+
.factorypath
9+
.project
10+
.settings
11+
.springBeans
12+
.sts4-cache
13+
14+
### IntelliJ IDEA ###
15+
.idea
16+
*.iws
17+
*.iml
18+
*.ipr
19+
20+
### NetBeans ###
21+
/nbproject/private/
22+
/nbbuild/
23+
/dist/
24+
/nbdist/
25+
/.nb-gradle/
26+
/build/
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4+
<modelVersion>4.0.0</modelVersion>
5+
<parent>
6+
<groupId>org.springframework.boot</groupId>
7+
<artifactId>spring-boot-starter-parent</artifactId>
8+
<version>2.1.3.RELEASE</version>
9+
<relativePath/> <!-- lookup parent from repository -->
10+
</parent>
11+
<groupId>geektime.spring.springbucks</groupId>
12+
<artifactId>customer-service</artifactId>
13+
<version>0.0.1-SNAPSHOT</version>
14+
<name>customer-service</name>
15+
<description>Demo project for Spring Boot</description>
16+
17+
<properties>
18+
<java.version>1.8</java.version>
19+
</properties>
20+
21+
<dependencies>
22+
<dependency>
23+
<groupId>org.springframework.boot</groupId>
24+
<artifactId>spring-boot-starter-web</artifactId>
25+
</dependency>
26+
27+
<dependency>
28+
<groupId>org.joda</groupId>
29+
<artifactId>joda-money</artifactId>
30+
<version>1.0.1</version>
31+
</dependency>
32+
33+
<dependency>
34+
<groupId>org.projectlombok</groupId>
35+
<artifactId>lombok</artifactId>
36+
<optional>true</optional>
37+
</dependency>
38+
<dependency>
39+
<groupId>org.springframework.boot</groupId>
40+
<artifactId>spring-boot-starter-test</artifactId>
41+
<scope>test</scope>
42+
</dependency>
43+
</dependencies>
44+
45+
<build>
46+
<plugins>
47+
<plugin>
48+
<groupId>org.springframework.boot</groupId>
49+
<artifactId>spring-boot-maven-plugin</artifactId>
50+
</plugin>
51+
</plugins>
52+
</build>
53+
54+
</project>

0 commit comments

Comments
 (0)