ማይክሮ አገልግሎቶችን እንዴት ማሰማራት እንደሚችሉ ይወቁ። ክፍል 1. ስፕሪንግ ቡት እና ዶከር

ማይክሮ አገልግሎቶችን እንዴት ማሰማራት እንደሚችሉ ይወቁ። ክፍል 1. ስፕሪንግ ቡት እና ዶከር

ሃይ ሀብር።

በዚህ ጽሑፍ ውስጥ, በማይክሮ ሰርቪስ ላይ ለመሞከር የመማሪያ አካባቢን በመፍጠር ስላለኝ ልምድ ማውራት እፈልጋለሁ. እያንዳንዱን አዲስ መሳሪያ ስማር ሁልጊዜ በአካባቢው ማሽን ላይ ብቻ ሳይሆን በተጨባጭ ሁኔታዎችም መሞከር እፈልጋለሁ. ስለዚህ, ቀለል ያለ ማይክሮ ሰርቪስ አፕሊኬሽን ለመፍጠር ወሰንኩ, በኋላ ላይ በሁሉም ዓይነት አስደሳች ቴክኖሎጂዎች "መሸፈን" ይችላል. የፕሮጀክቱ ዋና መስፈርት ለትክክለኛው ስርዓት ከፍተኛው የተግባር ቅርበት ነው.

መጀመሪያ ላይ የፕሮጀክቱን አፈጣጠር ወደ ብዙ ደረጃዎች ሰብሬዋለሁ፡-

  1. ሁለት አገልግሎቶችን ይፍጠሩ - 'የኋላ' (የኋላ) እና 'ጌትዌይ' (ጌትዌይ)፣ ወደ ዶክ ምስሎች ያሸጉዋቸው እና አብረው እንዲሰሩ ያዋቅሯቸው።

    ቁልፍ ቃላት: Java 11, Spring Boot, Docker, ምስል ማመቻቸት

  2. በGoogle Kubernetes ሞተር ውስጥ የኩበርኔትስ ውቅር እና የስርዓት ዝርጋታ ልማት

    ቁልፍ ቃላት: Kubernetes, GKE, ሀብት አስተዳደር, autoscaling, ሚስጥሮች

  3. ለተሻለ የክላስተር አስተዳደር ከ Helm 3 ጋር ገበታ መፍጠር

    መለያዎች: Helm 3, የገበታ ማሰማራት

  4. ኮድን ወደ ክላስተር በራስ ሰር ለማድረስ ጄንኪንስ እና የቧንቧ መስመር በማዘጋጀት ላይ

    ቁልፍ ቃላት፡ የጄንኪንስ ውቅር፣ ተሰኪዎች፣ የተለየ የማዋቀር ማከማቻ

ለእያንዳንዱ እርምጃ የተለየ ጽሑፍ ለመስጠት እቅድ አለኝ።

የዚህ ተከታታይ መጣጥፎች ትኩረት ማይክሮ ሰርቪስ እንዴት እንደሚፃፍ ሳይሆን በአንድ ነጠላ ሥርዓት ውስጥ እንዲሠሩ ማድረግ ነው። ምንም እንኳን እነዚህ ሁሉ ነገሮች አብዛኛውን ጊዜ ከገንቢው ሃላፊነት ውጭ ቢሆኑም, ቢያንስ 20% (ይህም እርስዎ እንደሚያውቁት, ውጤቱን 80% ይስጡ) ማወቅ አሁንም ጠቃሚ ነው ብዬ አስባለሁ. ጸሃፊው ስለዚህ ስርአት ለግል ጥቅም ብቻ የተፈጠረ ስለሆነ ብዙም ስላልተረዳ እንደ ደህንነት ያሉ አንዳንድ ያለምንም ቅድመ ሁኔታ አስፈላጊ ርዕሰ ጉዳዮች ከዚህ ፕሮጀክት ውጪ ይሆናሉ። ማንኛውንም አስተያየት እና ገንቢ ትችት እቀበላለሁ።

ጥቃቅን አገልግሎቶችን መፍጠር

አገልግሎቶቹ የተጻፉት በJava 11 ስፕሪንግ ቡት በመጠቀም ነው። የኢንተር አገልግሎት መስተጋብር REST በመጠቀም ይደራጃል። ፕሮጀክቱ አነስተኛውን የፈተናዎች ብዛት ያካትታል (ስለዚህ በኋላ በጄንኪንስ ውስጥ የሚሞከር ነገር አለ)። የአገልግሎቶቹ ምንጭ ኮድ በ GitHub ላይ ይገኛል፡- ጀርባ и መግቢያ.

የእያንዳንዳቸውን አገልግሎቶች ሁኔታ ለመፈተሽ፣ ስፕሪንግ አንቀሳቃሽ ወደ ጥገኝነታቸው ተጨምሯል። የ/actuator/የጤና የመጨረሻ ነጥብ ይፈጥራል እና አገልግሎቱ ትራፊክ ለመቀበል ዝግጁ ከሆነ 200 ደረጃን ይመልሳል፣ ወይም ችግር ካለ 504። በዚህ ጉዳይ ላይ፣ አገልግሎቶቹ በጣም ቀላል ስለሆኑ፣ እና ከአቅም በላይ የሆነ ሃይል ቢፈጠር፣ በከፊል ወደ ስራ ከመቀጠል ይልቅ ሙሉ ለሙሉ የማይገኙ ስለሚሆኑ ይህ ምናባዊ ፍተሻ ነው። ነገር ግን በእውነተኛ ሲስተሞች ውስጥ፣ ተጠቃሚዎች ስለ ችግሩ መታገል ከመጀመራቸው በፊት Actuator ችግርን ለመመርመር ይረዳል። ለምሳሌ፣ የውሂብ ጎታውን የመድረስ ችግሮች ካሉ፣ በተበላሸ የአገልግሎት ምሳሌ የሚቀርቡ ጥያቄዎችን በማቆም ለዚህ ምላሽ መስጠት እንችላለን።

የኋላ መጨረሻ አገልግሎት

የኋለኛው አገልግሎት በቀላሉ ይቆጥራል እና ተቀባይነት ያላቸውን ጥያቄዎች ብዛት ይመልሳል።

የመቆጣጠሪያ ኮድ:

@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.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")

ሁሉም ነገር እየሰራ ነው። በትኩረት የሚከታተል አንባቢ የመግቢያ መንገዱን በማለፍ የጀርባውን ቀጥታ እንዳንደርስ የሚከለክለን ምንም ነገር እንደሌለ ያስተውላል (http://localhost:8081/requests). ይህንን ለማስተካከል አገልግሎቶቹ ወደ አንድ አውታረመረብ መቀላቀል አለባቸው, እና መግቢያው ብቻ ከውጭ "መለጠጥ" አለበት.
እንዲሁም ሁለቱም አገልግሎቶች አንድ የፋይል ስርዓት ይጋራሉ, ዥረቶችን ያመርቱ እና በአንድ ጊዜ እርስ በርስ መጠላለፍ ሊጀምሩ ይችላሉ. ማይክሮ አገልግሎቶቻችንን ብንለየው ጥሩ ነው። ይህ በተለያዩ ማሽኖች (ብዙ ገንዘብ፣ አስቸጋሪ)፣ ቨርቹዋል ማሽኖችን (የሃብት ኢንተቲቭ፣ ረጅም ጅምር) በመጠቀም አፕሊኬሽኖችን በማሰራጨት ወይም ኮንቴይነሮችን በመጠቀም ማግኘት ይቻላል። እንደተጠበቀው, ሦስተኛውን አማራጭ እና እንመርጣለን Docker እንደ መያዣ (ኮንቴይነር) እንደ መሳሪያ.

Docker

በአጭር አነጋገር, ዶከር በተናጠል መያዣዎችን ይፈጥራል, በእያንዳንዱ መተግበሪያ. ዶከር ለመጠቀም Dockerfile - አፕሊኬሽኑን ለመገንባት እና ለማሄድ መመሪያዎችን መጻፍ ያስፈልግዎታል። በመቀጠል, ምስሉን መገንባት, ወደ የምስል መዝገብ ቤት መስቀል ይችላሉ (ቁ. ዶከርሁብ) እና ማይክሮ ሰርቪስዎን በማንኛውም የተከለለ አካባቢ በአንድ ትዕዛዝ ያሰማሩ።

Dockerfile

የምስሉ በጣም አስፈላጊ ከሆኑት ባህሪያት አንዱ መጠኑ ነው. የታመቀ ምስል ከርቀት ማከማቻ በፍጥነት ይወርዳል፣ ትንሽ ቦታ ይወስዳል፣ እና አገልግሎትዎ በፍጥነት ይጀምራል። ማንኛውም ምስል የተገነባው በመሠረታዊው ምስል መሰረት ነው, እና በጣም ዝቅተኛውን አማራጭ ለመምረጥ ይመከራል. ጥሩው አማራጭ አልፓይን ነው, የተሟላ የሊኑክስ ስርጭት በትንሹ ጥቅሎች.

ለመጀመር፣ 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 ትዕዛዙ በኮንቴይነሩ ውስጥ ያለው አፕሊኬሽን የራሱን ወደብ 8080 እንደሚጠቀም ለዶከር ይጠቁማል (ይህ አፕሊኬሽኑን ከውጭ ተደራሽ አያደርገውም ነገር ግን አፕሊኬሽኑን ማግኘት ያስችላል ለምሳሌ ከሌላ ኮንቴይነሮች በተመሳሳይ ዶክ ኔትወርክ ).

አገልግሎቶችን ወደ ምስሎች ለማሸግ ከእያንዳንዱ ፕሮጀክት ስር ሆነው ትዕዛዞችን ማስኬድ ያስፈልግዎታል፡-

docker image build . -t msvc-backend:1.0.0

ውጤቱ 456 ሜባ ምስል ነው (ከዚህም ውስጥ የ JDK ምስል 340 ሜባ ይይዛል)። እና ሁሉም በፕሮጀክታችን ውስጥ ያሉት ክፍሎች በጣት ላይ ሊቆጠሩ ቢችሉም. የምስላችንን መጠን ለመቀነስ፡-

  • ባለብዙ ደረጃ ስብሰባን እንጠቀማለን. በመጀመሪያው ደረጃ ፕሮጀክቱን እንገነባለን, በሁለተኛው ደረጃ JRE ን እንጭነዋለን, እና በሶስተኛው ደረጃ ሁሉንም ወደ አዲስ ንጹህ የአልፕስ ምስል እንገለብጣለን. በጠቅላላው በመጨረሻው ምስል ውስጥ አስፈላጊዎቹ ክፍሎች ብቻ ይሆናሉ.
  • የጃቫን ሞዱላላይዜሽን እንጠቀም። ከጃቫ 9 ጀምሮ፣ ከሚፈልጓቸው ሞጁሎች ብቻ JRE ለመፍጠር የ jlink መሣሪያን መጠቀም ይችላሉ።

ለጠያቂው፣ በምስል ቅነሳ አቀራረቦች ላይ ጥሩ ጽሑፍ እዚህ አለ። https://habr.com/ru/company/ruvds/blog/485650/.

የመጨረሻ ሰነድ ፋይል፡-

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 ሜባ ነው. መጥፎ አይደለም. ከዚያ በኋላ ምስሎችዎ ከበይነመረቡ ለመውረድ እንዲገኙ ዝግጁ የሆኑ ምስሎች ወደ ምስል መዝገብ ቤት ሊሰቀሉ ይችላሉ።

በዶከር ውስጥ አብሮ የሚሰራ አገልግሎቶች

ሲጀመር አገልግሎታችን በተመሳሳይ አውታረ መረብ ላይ መሆን አለበት። በዶክተር ውስጥ ብዙ አይነት አውታረ መረቦች አሉ, እና ከእነሱ ውስጥ በጣም ጥንታዊውን እንጠቀማለን - ድልድይ, ይህም በተመሳሳይ አስተናጋጅ ላይ የሚሰሩ ኮንቴይነሮችን ለማገናኘት ያስችልዎታል. በሚከተለው ትዕዛዝ አውታረ መረብ ይፍጠሩ

docker network create msvc-network

በመቀጠል 'የኋላ' የተሰየመውን የኋላ መያዣ በማይክሮ ሰርቪስ-የኋላ:1.0.0 ምስል ይጀምሩ፡

docker run -dit --name backend --network msvc-net microservices-backend:1.0.0

የድልድዩ አውታር ከሳጥኑ አገልግሎት ግኝት ለኮንቴይነሮች በስማቸው እንደሚሰጥ ልብ ሊባል የሚገባው ጉዳይ ነው። ማለትም፣ የኋለኛው አገልግሎት በዶክተር ኔትወርክ ውስጥ ይገኛል። http://backend:8080.

የመግቢያ መንገዱን መጀመር;

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 እያስተላለፍን መሆኑን እንገልፃለን። የአካባቢ ተለዋዋጮችን ለማዘጋጀት የኢንቭ አማራጮችን እንጠቀማለን በፀደይ ወቅት የሚነበቡ እና ንብረቶቹን ከመተግበሪያ ንብረቶች ለመሻር።

ከጀመርን በኋላ እንጠራዋለን http://localhost/ እና ሁሉም ነገር እንደሚሰራ እርግጠኛ ይሁኑ, ልክ እንደ ቀድሞው ሁኔታ.

መደምደሚያ

በውጤቱም, ሁለት ቀላል ማይክሮ ሰርቪሶችን ፈጠርን, በዶክተር ኮንቴይነሮች ውስጥ ታሽገው እና ​​በአንድ ማሽን ላይ አንድ ላይ አስነሳናቸው. የተፈጠረው ስርዓት ግን በርካታ ጉዳቶች አሉት።

  • ደካማ ስህተት መቻቻል - ሁሉም ነገር በአንድ አገልጋይ ላይ ይሰራል
  • ደካማ የመለጠጥ ችሎታ - ጭነቱ ሲጨምር ተጨማሪ የአገልግሎት ምሳሌዎችን በራስ-ሰር ማሰማራት እና በመካከላቸው ያለውን ጭነት ማመጣጠን ጥሩ ይሆናል
  • የማስጀመሪያው ውስብስብነት - ቢያንስ 3 ትዕዛዞችን ማስገባት ነበረብን እና ከተወሰኑ መለኪያዎች ጋር (ይህ ለ 2 አገልግሎቶች ብቻ ነው)

ከላይ ያሉትን ችግሮች ለማስተካከል እንደ Docker Swarm, Nomad, Kubernetes ወይም OpenShift የመሳሰሉ በርካታ መፍትሄዎች አሉ. አጠቃላይ ስርዓቱ በጃቫ ከተፃፈ፣ ወደ ስፕሪንግ ክላውድ መመልከት ይችላሉ (ጥሩ ጽሑፍ).

В ቀጣይ ክፍል ኩበርኔትስ እንዴት እንዳዋቀርኩ እና ፕሮጀክቱን ወደ ጎግል ኩበርኔትስ ኢንጂን እንዳሰማራሁ እናገራለሁ።

ምንጭ: hab.com

አስተያየት ያክሉ