α α α αΆαα
αα αααα»αα’αααααααα αααα»αα αααα·ααΆαα’αααΈαααα·ααααααααααααα»ααααα»αααΆααααααΎαααα·ααΆααΆααα·ααααΆαααααΆααααΆααα·αααααααΆαα½αααΈααααΌααΊααΈαα αα ααααααα»ααααα§αααααααααΈααΈαα½αα αααα»ααααααα ααααΆαααααααΆαα·αααααΉααααα ααΎαααΆαααΈααααα»ααααα»αααα»ααααααα ααα»αααααααααΆαααα αααα»αααααααααααΆαααααααααααααα ααΌα ααααα αΎα αααα»αααΆααααααα α α·ααααααααΎααααααα·ααΈ microservice ααΆαααααα½α ααααααααααα’αΆα ααααΌαααΆα "αααααααααα" ααΆαα½αααΉαααααααααααααααα αα αααα·ααααΆαα½αα±ααα αΆααα’αΆααααααα αααααΌαααΆαα αααααααααΆααααααααααΊααΆααα·ααα»αααΆαα’αα·ααααΆααααααΆαα ααΉααααααααααα·αα
ααΆααααΌα αααα»αααΆααααα ααααΆααααααΎαααααααααΆααα αΆααααΆα αααΎαα
-
αααααΎαααααΆααααααΈα - 'backend' (backend) αα·α 'gateway' (gateway) ααα ααααΆαα αααα»αααΌαααΆα docker α αΎαααααααα½αααΆα±ααααααΎαααΆαααΆαα½αααααΆ
ααΆααααααααΉαα Java 11, Spring Boot, Docker, ααΆααααααΎαααααα·αααααΆαααΌαααΆα
-
ααΆααααααααΉαα Kubernetes, GKE, ααΆααααααααααααααΆα, ααΆαααααΎααΆαααααααΆααααααααααααααααα·, α’αΆααααααΆαα
-
αααααΎαααΆααΆααααααααΎ Helm 3 αααααΆααααΆααααααααααα αααααααΆααααααΆαααααα·αααααΆα
ααααΆα: Helm 3, ααΆαααΆαααααααΆαααααΌαααΆα
-
ααΆαααα‘αΎα Jenkins αα·αααααααααααΆαααααααΌαααΌααααααααααααααααα·αα α ααααα
ααΆααααααααΉαα ααΆαααααααα ααΆαααααααα Jenkins αααααα·ααΈαααα½α ααααΆααααααααα ααΆααααααααααΆα ααααα‘αα
αααα»ααααααααΉααααααα’αααααααΆα ααααα‘αααα½ααα ααα αΆαααΈαα½ααα
ααΆααααααα’αΆααααααααα’ααααααααααΈααα αα·ααααααΆαααααααααααααΆααΈααααΌαα ααα»ααααααααααααΎα±αααα½αααΆααααΎαααΆααααα»ααααααααααααα½αα αααααΈααΆααΏαααΆααα’αααααααΆααααααΆαα ααΆααααα ααΆαααα½ααα»αααααΌαααααα’αααα’αα·ααααααααααα αααα»ααα·αααΆααΆαα ααααΆααααααααααααα»αααΆαααααΆαααα½ααααααΆαα αα ααΆαα 20% (αααααΌα αααα’αααααΆαααΉαα αΎαααΆ 80% αααααααα)α αααααΆαααααααΆααααα½αα ααα½ααααααααΆααααααααα ααΌα ααΆαα»ααααα·ααΆα ααΉαααααΌαααΆααα»αα ααααΈααααααααα αααααΆαα’ααααα·ααααααααα·α αα½α α’αααΈαααααααααααααααΌαααΆααααααΎαα‘αΎααααααΆααααααΆαααααΎααααΆααααααΆαααααα½αααα»αααααα αααα»αααααΆααααααΆααααα·ααααα αα·αααΆααα·αααααααα»ααααααααΆαααΆα
ααΆααααααΎαααααΆααααααΈααααΌ
ααααΆααααααααΌαααΆαααααααα
αααα»α Java 11 αααααααΎ Spring Boot α α’ααααααααΆααααααααΌαααΆααααα
ααααααααΎ REST α αααααααααααΉααα½ααααα
αΌαα
ααα½αα’αααααααΆααααΆαααααΎααααα (ααΌα
αααααα
ααααααααααΆαα’αααΈαααααααΌαααΆααααααα
αααα»α Jenkins) α ααΌαααααααααααΆααααααΆααααααΆααα
ααΎ GitHubα
ααΎααααΈα’αΆα αα·αα·αααααΎαααααΆαααΆαααααααΆααααααΈαα½ααααα Spring Actuator ααααΌαααΆααααααααα ααΆαα’αΆααααααααααα½αααα ααΆααΉααααααΎαα ααα»α αααα αα / actuator/health α αΎαααΉααααα‘ααααααΆαααΆα 200 ααααα·αααΎααααΆαααααα½α ααΆααααΎααααΈααα½αααα ααΆα ααα α¬ 504 αααα»αααααΈααΆααααα αΆα αααα»αααααΈααα αααααΊααΆααΆαααααααααααα·αααΆα α αΆααααΆααααΈααααΆααΊααΆααααααΆαα α αΎααα ααααααααααααααα αΆα’αααΆα αα½αα ααα½α αα½αααΆααααααΆαα·αα’αΆα ααααΎααΆαααΆαααααα»αααΆααΆααα ααααααΎαααΆαααααααααα ααα»αααααα αααα»ααααααααααα·α Actuator α’αΆα αα½αααααΎααααα·αα·α αααααααα αΆαα½α αα»ααααα’αααααααΎααααΆααα αΆααααααΎαα α»α αα ααΎααΆα α§ααΆα ααα ααααα·αααΎαααα αΆααΎαα‘αΎαααΆαα½αααΉαααΆαα αΌααα ααΆααααΌαααααΆααα·αααααα ααΎαα’αΆα ααααΎααααααααααααααααααα·α αααααααα αΆααααααααααααααΆαααααΎαααΆαααααΎααΆαα½αααΉαα§ααΆα ααααααααΌα ααααααΆααααα
ααααΆαααααααααααΆαααααα
ααααΆαααα backend ααΉαααααΆααααααΆαα αα·ααααα‘ααα ααα½αααααΎαααααΆαααα½αααα
αααααΌαα§ααααααααααΆα
@RestController
public class RequestsCounterController {
private final AtomicLong counter = new AtomicLong();
@GetMapping("/requests")
public Long getRequestsCount() {
return counter.incrementAndGet();
}
}
ααΆαααααΎαααααα§ααααααααααΆα
@WebMvcTest(RequestsCounterController.class)
public class RequestsCounterControllerTests {
@Autowired
private MockMvc mockMvc;
@Test
public void firstRequest_one() throws Exception {
mockMvc.perform(get("/requests"))
.andExpect(status().isOk())
.andExpect(MockMvcResultMatchers.content().string("1"));
}
}
α αααααααΆαααααΆαααα
α αααααααΌαααΉααααααΌαααααΎαα ααΆααααααΆαααα backend αααααααααααΆααΆαα½αααΉαααααααΆαααΆααααααα
- ααααααααΆααα αααααααΌαα ααΆααααΌαααΆαααΆα αΆαααΆα αααΎααααΈα±ααααΆα’αΆα αααα ααα§ααΆα ααααα½αααα αααααααΌαα ααααΈαα½ααααααααααααααΆαααααΎααααααααααΆαααΈααα
- "α’αΆααααααΆαα" ααΆααααΆαααααααΉαααΎααα½ααΆααΈααααΆααααααααΆααααααΆααααααΆααααΆαα (ααααααααΉααααααΆααααΆαα’αα·αααααΈαααΌααΈααααααΆαα)
ααΆαααααααα ααΆαααααααααα αααα»α application.properties:
backend.url=http://localhost:8081
instance.id=${random.int}
secret="default-secret"
α’αΆααΆαααααααΆααααααα
@Service
public class BackendAdapter {
private static final String REQUESTS_ENDPOINT = "/requests";
private final RestTemplate restTemplate;
@Value("${backend.url}")
private String backendUrl;
public BackendAdapter(RestTemplateBuilder builder) {
restTemplate = builder.build();
}
public String getRequests() {
ResponseEntity<String> response = restTemplate.getForEntity(
backendUrl + REQUESTS_ENDPOINT, String.class);
return response.getBody();
}
}
α§ααααααααααΆα
@RestController
@RequiredArgsConstructor
public class EndpointController {
private final BackendAdapter backendAdapter;
@Value("${instance.id}")
private int instanceId;
@Value("${secret}")
private String secret;
@GetMapping("/")
public String getRequestsCount() {
return String.format("Number of requests %s (gateway %d, secret %s)", backendAdapter.getRequests(), instanceId, secret);
}
}
ααΎαααααΎαααΆαα
ααΎαα αΆααααααΎααααααααΆααααααα
./mvnw package -DskipTests
java -Dserver.port=8081 -jar target/microservices-backend-1.0.0.jar
α αΆααααααΎαα αααααααΆαα
./mvnw package -DskipTests
java -jar target/microservices-gateway-1.0.0.jar
αααα»ααα·αα·ααα:
$ curl http://localhost:8080/
Number of requests 1 (gateway 38560358, secret "default-secret")
α’αααΈααααααααΆααααα»αααααΎαααΆαα α’αααα’αΆααααααα
α·ααααα»αααΆααααΉαααααααααΆααααΆααααΆαα’αααΈααΆααΆααααΎαααΈααΆαα
αΌααα
ααΆαααααααααΆαααααααααααααΆαααα αααααααααΆααα
αααα
ααα
αΌα (
ααΌα
ααααΆαααααααα ααααΆααΆααααΈαα
αααααααααααααααα―αααΆααααα½α αααααΎαααααααΈα α αΎααα
ααααααα½αα’αΆα
α
αΆααααααΎαααααααααααααααΆαα
αα·ααα
ααα ααΆααΆααΆααααααΎαααΆαααααα»αααΆααααααααΆααααααΈααααΌααααααΎαα αααα’αΆα
αααααα
ααΆααααααΆαα
ααα
αΆααααααα·ααΈαα
ααΎαααΆαααΈαααααααααααΆ (αα»αα
αααΎα αα·ααΆα) αααααααΎαααΆαααΈααα·αααα·α (ααααΎααααΆαα
αααΎα ααΆαα
αΆααααααΎαααΌα) α¬ααααΎαα»αααΊαααα ααΌα
αααααΆαααααΉααα»αααΎαααααΎαααΎααααααΎαααΈααΈαα·α
Dockers
ααα»ααα Docker αααααΎααα»αααΆα
ααααα‘αα αα½ααααα»ααα½ααααααα·ααΈα ααΎααααΈααααΎ Docker α’αααααααΌαααααα Dockerfile - ααΆαααααΆααααααΆαααααααΎα αα·αααααΎαααΆααααααα·ααΈα αααααΆααβαα α’αααβα’αΆα
βαααααΎαβααΌαααΆα αααα»αβα‘αΎαβαα
βαααα»αβαααααΈβαααααβααΌαααΆα (No.
Dockerfile
ααααααααααΆαααααα»ααα½αααααΌαααΆαααΊααα αααααααΆα ααΌαααΆαααααα½αααΉαααΆαααααΏαααΆααα»αααΈααααΆααααΈα ααααΆα ααααΎααα ααα·α α αΎαααααΆααααααααα’αααααΉαα αΆααααααΎαααΏαααΆααα»αα ααΌαααΆαααΆαα½αααααΌαααΆααααααΎαα‘αΎααααααα’ααααΎααΌαααΆαααΆααΌαααααΆα α αΎαααΆααααΌαααΆαααααΆαα±ααααααΎαααΎααααααΎααα·α αα½α αααα»αα αααααΎαααααα’αα½αααΊ Alpine αααααΆααΆαα ααα αΆαααΈαα»α ααααααααΆαα½αααΉααααα ααα’αααααααΆα
ααΎααααΈα αΆααααααΎα α αΌαααΎαααααΆααΆαααααα Dockerfile "αα ααΎααααΆα" (αααα»αααΉααα·ααΆαααααΆααααΆαααααΆαα·ααΈα’αΆααααα αα»αααααΎααΆ):
FROM adoptopenjdk/openjdk11:jdk-11.0.5_10-alpine
ADD . /src
WORKDIR /src
RUN ./mvnw package -DskipTests
EXPOSE 8080
ENTRYPOINT ["java","-jar","target/microservices-gateway-1.0.0.jar"]
αα ααΈαααααΎααααα»αααααΎααΌαααΆαααΌαααααΆααααααΆαααΌαααααΆαααΎα’αΆαααααααΆαα½α JDK αααααΆαααα‘αΎααα½α α αΎαααΎααααΈαααααΎαααααααααααααΎαα ααΆαα½αααΉαααΆααααααααΆ ADD ααΎααααααααα src αα αα α»αααααααα ααΌαααΆα αααααΆααααΆααΆααααΎααΆα (WORKDIR) α αΎαα αΆααααααΎαααΆαααααΆαααΆα ααΆααααααααΆ EXPOSE 8080 ααααααααααΆααα docker ααΆαααααα·ααΈαα αααα»ααα»αααΊαααααΉαααααΎα ααα 8080 ααααααΆ (ααΆααΉααα·αααααΎα±αααααααα·ααΈα’αΆα α αΌαααααΎααΆαααΈααΆααααα αα ααα»ααααααΉαα’αα»ααααΆαα±αααααααα·ααΈα’αΆα α αΌαααααΎααΆα α§ααΆα ααα ααΈαα»αααΊααααααααααααα ααΎαααααΆα docker ααΌα ααααΆ )
ααΎααααΈααα ααα ααααααΆαααααα ααΆααΌαααΆα α’αααααααΌαααααΎαααΆαααΆααααααααΆααΈ root ααααααααααΈαα½ααα
docker image build . -t msvc-backend:1.0.0
ααααααααΊααΌαααΆα 456 MB (αααααΌαααΆα JDK ααΌαααααΆαααΆααααΆαα 340 MB) α α αΎαααΆααα’ααααΎαααααΈααΆααΆααα·ααααααΆααααΆαααα αααα»αααααααααααααΎαα’αΆα ααααΌαααΆαααΆαααα ααΎααααΆααααα½αα ααΎααααΈααΆαααααααααα αααΌαααΆαααααααΎαα
- ααΎαααααΎααΆααααα»ααα α»ααα αΆαα αα αααα»αααα αΆαααααΌα ααΎαααΉααααααΌααααα»ααααααα α αΎααα αααα»αααΈααΈα ααΎαααΉαααα‘αΎα JRE α αΎααααα»αααα αΆαααΈααΈ ααΎαααΉαα ααααααΆααα’ααααααα ααΆααΌαααΆαα’αΆαααααααααΈααα’αΆαα ααα»ααα ααΌαααΆαα α»ααααααααΉαααΆααααααΆαααΆαα»α αΆαααΆα αααα»αααααα
- α αΌαααΎαααααΎ modularization αα java α α αΆααααααΎαααΆαα½α Java 9 α’αααα’αΆα ααααΎα§ααααα jlink ααΎααααΈαααααΎα JRE ααΈαααΌαα»ααααα’αααααααΌαααΆα
αααααΆααα’ααααααα
ααααΉαα
ααααΎα ααΆαααααααααααΊααΆα’αααααααααα’αα½αααααΈααΈαα·ααΈααΆαααααααΆαααααααααΌαααΆαα
Dockerfile α α»ααααααα
FROM adoptopenjdk/openjdk11:jdk-11.0.5_10-alpine as builder
ADD . /src
WORKDIR /src
RUN ./mvnw package -DskipTests
FROM alpine:3.10.3 as packager
RUN apk --no-cache add openjdk11-jdk openjdk11-jmods
ENV JAVA_MINIMAL="/opt/java-minimal"
RUN /usr/lib/jvm/java-11-openjdk/bin/jlink
--verbose
--add-modules
java.base,java.sql,java.naming,java.desktop,java.management,java.security.jgss,java.instrument
--compress 2 --strip-debug --no-header-files --no-man-pages
--release-info="add:IMPLEMENTOR=radistao:IMPLEMENTOR_VERSION=radistao_JRE"
--output "$JAVA_MINIMAL"
FROM alpine:3.10.3
LABEL maintainer="Anton Shelenkov [email protected]"
ENV JAVA_HOME=/opt/java-minimal
ENV PATH="$PATH:$JAVA_HOME/bin"
COPY --from=packager "$JAVA_HOME" "$JAVA_HOME"
COPY --from=builder /src/target/microservices-backend-*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
ααΎααααααΎαααΌαααΆαα‘αΎααα·α α αΎαααΆαααααα ααΆααΆαααΆαααααααααα 6 αα ααααΎααΉα 77 MBα αα·αα’αΆαααααβααα αααααΆααααΈααα ααΌαααΆααααααααααα½α ααΆααααα α’αΆα ααααΌαααΆααααα»αα‘αΎααα αααα»ααααααΈαααααααΌαααΆα ααΌα ααααααΌαααΆαααααα’αααα’αΆα ααΆαααααΆαααΈα’ααΈαααΊαα·αα
ααααΆαααααα½αααααΆαα αααα»α Docker
ααΎααααΈα αΆααααααΎα ααααΆααααααααααΎαααααΌααααααα·ααα ααΎαααααΆααααα½αα ααΆααααααΆαααΆα αααΎααααααααα αααα»α docker α αΎαααΎαααααΎααΆααααααα»ααααα½αααΆ - ααααΆα αααα’αα»ααααΆαα±ααα’ααααααααΆααα»αααΊαααααααΎαααΆαααΎαααΆαααΈααααα½αα αααααΎααααααΆααααααααΎααΆααααααααΆααΆααααααα
docker network create msvc-network
αααααΆαααα α αΆααααααΎααα»αααΊααααααααααΆαααααααααααΆααααααααΆ 'backend' ααΆαα½αααΉαααΌαααΆα microservices-backend: 1.0.0α
docker run -dit --name backend --network msvc-net microservices-backend:1.0.0
ααΆαα½αα±ααααααααααΆααααΆαααααΆαααααΆααααααααΌαααΆαααααΎαααααΆαααααααα’αααααααΆαααα»αααΊαααααΆαααααααααααα½αααα αααααΊααααΆαααα backend ααΉαααΆααα
αααα»ααααααΆα docker αα
α αΆααααααΎαα αααααααΆαα
docker run -dit -p 80:8080 --env secret=my-real-secret --env BACKEND_URL=http://backend:8080/ --name gateway --network msvc-net microservices-gateway:1.0.0
αα αααα»αααΆααααααααΆαααααΎααααα αΆαααΆααΎααααα»ααααααΌαααααα ααα 80 αααααΆαααΈαααααααΎααα α ααα 8080 αααα»αααΊαααα ααΎαααααΎαααααΎα env ααΎααααΈαααααα’αααααα·ααααΆααααααΉαααααΌαααΆαα’αΆααααααααααααααααα·ααααα·ααΆααααΌα αα·αααα·ααααααααααααααααα·ααΈ application.properties α
αααααΆααααΈα
αΆααααααΎαααΎαα α
ααα ααααΈααααα·ααααΆα
ααΆαααααα ααΎαααΆααααααΎα microservices ααΆααααα ααα½αααΈα αααααα ααααΆαα αααα»α docker containers α αΎαααΆααα±ααααααΎαααΆαααΆααΆαα½αααααΆαα ααΎαααΆαααΈααααα½αα ααααααΆαααΆ ααααααααααααααααΆααα»ααα·ααααα·αα½αα ααα½αα
- ααΆαα’ααα±αα ααααααα α»ααα·αααα’ - α’αααΈαααααΎαααΆααααααΆααααΎααα ααΎαααΆαααΈααααααα½α
- ααΆαααααΎααΆαααααααΆααα·αααα’ - αα ααααααααΆααααα»αααΎαα‘αΎα ααΆααΆααΆααααααΎαααΆαααααα»αααΆαααΆααα±ααααααΎααααΆααααααΆαααααααααααααααααααααααααα· αα·αααααΎα±ααααΆααα»αααααΆααααΆαααααα»ααααΆααα½αααΆα
- ααΆααααα»αααααΆαααααΆαα αΆααααααΎα - ααΎαααααΌααααα αΌαααΆααααααααΆαααΆαα αα ααΆαα 3 α αΎαααΆαα½αααΉααααΆαααΆααααααααΆααααΆαα (αααααΊαααααΆααααααααΆαααα 2 ααα»ααααα)
ααΎααααΈαααααααΆααααα αΆααΆαααΎ ααΆααααααααααΆααα½αα
ααα½αααΌα
ααΆ Docker Swarm, Nomad, Kubernetes α¬ OpenShift α ααααα·αααΎααααααααααΆααααΌαααααΌαααΆααααααααΆ Java α’αααα’αΆα
ααΎααα
Spring Cloud (
Π
ααααα: www.habr.com