간단한 Spring 클라우드 마이크로서비스 프로젝트 구축

IDE 개발 도구: IntelliJ IDEA 14.0.2

버전 관리: Maven

기술 스택: Spring Cloud

환경: JDK 1.8

1. 메이븐 프로젝트 생성

1. 그림과 같이 파일——>새 프로젝트——>Maven:

2. 모듈 이름과 프로젝트 경로를 입력합니다.

 

위의 단계에 따라 Maven 프로젝트가 생성됩니다.

이 시점에서 프로젝트는 아직 SpringBoot 프로젝트가 아닙니다.

2. 하위 프로젝트 생성

동일한 방식으로 하위 프로젝트를 생성합니다. 그룹 이름은 pom.xml에서 선언해야 합니다. 가장 간단한 마이크로서비스 프로젝트 구조 중 하나는 다음과 같습니다. 그 중 common은 엔터티 등에 대해 별도로 추출되며, 이후 다른 프로젝트에서 도입된 모듈로 사용하고 있습니다. eureka-server는 유레카 서버이며 다른 비즈니스 모듈은 클라이언트로 등록해야 합니다. 시스템 관리는 로그인 인터페이스를 구현하는 비즈니스 모듈의 예입니다.

3. 각 모듈 폼 구성

1. 총 프로젝트

주로 모듈 및 종속성 버전 관리

자신의 프로젝트를 만들 때 groupId를 groupId로 변경해야 합니다.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.cloud</groupId>
    <artifactId>cloud-demo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>eureka</module>
        <module>web-server</module>
        <module>common</module>
        <module>system-management</module>
    </modules>
    <packaging>pom</packaging>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <!--<version>1.5.6.RELEASE</version>-->
        <version>1.5.22.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>


    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>0.4.3</version>
                <configuration>
                    <skipDockerBuild>true</skipDockerBuild>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

2. 공통 모듈

부모는 전체 프로젝트의 artifactId로 지정해야 합니다.

자신의 프로젝트를 만들 때 groupId를 groupId로 변경해야 합니다.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>cloud-demo</artifactId>
        <groupId>com.cloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>common</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>
</project>

3.유레카 서버

아티팩트와 그룹 이름이 동일합니다.

핵심 의존성은

유레카 서버

코드 요구 사항에 따라 다른 종속성이 도입됩니다.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>cloud-demo</artifactId>
        <groupId>com.cloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>eureka</artifactId>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Edgware.SR6</spring-cloud.version>

    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>



</project>

4. 마이크로서비스 모듈

아티팩트와 그룹 이름이 동일합니다.

핵심 종속성은 eureka 클라이언트, Feign 클라이언트, Springboot입니다.

및 공개 모듈

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <artifactId>cloud-demo</artifactId>
        <groupId>com.cloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <artifactId>system-management</artifactId>
    <name>system-management</name>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Edgware.SR6</spring-cloud.version>
    </properties>


    <dependencies>
        <!--eureka客户端-->

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>

        <!--数据库配置-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.6</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.4</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.35</version>
        </dependency>

        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>




        <!--springboot配置-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>


        <!--Feign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-feign</artifactId>
        </dependency>
        <!--公共模块-->
        <dependency>
            <groupId>com.cloud</groupId>
            <artifactId>common</artifactId>
            <version>1.0-SNAPSHOT</version>
            <scope>compile</scope>
        </dependency>

    </dependencies>



    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

</project>

5.가장

핵심 의존성은

Eureka 클라이언트, Feign 서버, Springboot, 공개 모듈

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>cloud-demo</artifactId>
        <groupId>com.cloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>web-server</artifactId>
    <packaging>jar</packaging>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Edgware.SR6</spring-cloud.version>
    </properties>
    <dependencies>



        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-feign</artifactId>
        </dependency>
        <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>


        <dependency>
            <groupId>com.cloud</groupId>
            <artifactId>common</artifactId>
            <version>1.0-SNAPSHOT</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

네, yml 구성

1. 유레카 서버

주요 기능은 포트 번호를 구성하는 것입니다.

server:
  port: 7001
eureka:
  instance:
    hostname: eureka7001.com #eureka服务端的实例名称
  client:
    register-with-eureka: false     #false表示不向注册中心注册自己。
    fetch-registry: false     #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    service-url:
      #设置与eureka  server交互的地址和注册服务都需要依赖这个地址
      defaultZone: http://eureka7001.com:7001/eureka/  #单机就是指向自己

2. 마이크로서비스 모듈

주요 기능은 포트 번호와 mybatis 및 데이터베이스를 구성하는 것입니다.

server.port=8099
#server.servlet.context-path=/disk
#spring.web.resources.static-locations=classpath:/templates/, classpath:/static/

spring.application.name=system-management

# MyBatis Configuration
mybatis.mapper-locations=classpath:mapper/*Mapper.xml
mybatis.type-aliases-package=import com.cloud.pojo


# Database Configuration
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=123456

3.가장

포트 번호를 구성하기만 하면 됩니다.

각 구성 파일의 위치는 다음과 같습니다.

그 중 시스템 관리는 마이크로 서비스 모듈이고 웹 서버는 Feign입니다.

yml은 각 모듈의 리소스 디렉터리에 있고 pom은 각 모듈의 루트 디렉터리에 있습니다.

각 종속성 및 구성 항목의 역할을 이해하는 것이 가장 좋으며 문제가 발생할 경우 해결하는 데 도움이 됩니다.

버전은 통합된 방식으로 관리하는 것이 가장 좋습니다.

5. 비즈니스 코드 작성

1. 유레카 런처

package com.buba.springcloud.eureka;
 
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
 
 
@SpringBootApplication
@EnableEurekaServer
public class EurekaMain {
    public static void main(String[] args) {
        SpringApplication.run(EurekaMain.class,args);
    }
}

2. 마이크로서비스 인에이블러

package com.study.springcloud.systemmanagement;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;


@SpringBootApplication
@EnableEurekaClient


public class SystemManagementApplication {

    public static void main(String[] args) {
        SpringApplication.run(SystemManagementApplication.class, args);
    }

}

3. 가짜 런처

package com.cloud;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.feign.EnableFeignClients;
import org.springframework.context.annotation.ComponentScan;

//@ComponentScan(basePackages = {"com.study.springcloud.feign"})
//@EnableDiscoveryClient
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients

//@EnableFeignClients(basePackages = "com.cloud.client")
//@EnableFeignClients(basePackages = {"com.cloud"})

public class WebServerApplication {
    public static void main(String[] args) {

        SpringApplication.run(WebServerApplication.class, args);
    }
}

4. 공개 수업

package com.cloud.pojo;

public class User {
    private int id;
    private String username;
    private String password;

    public User() {
    }
    public User(String username, String password){
        this.username=username;
        this.password=password;
    }


    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

}

5.가장

5.1가장 클라이언트

package com.cloud.client;


import com.cloud.pojo.User;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;


@FeignClient(name="system-management",url = "http://localhost:8099")
public interface LoginClient {

    @RequestMapping(value = "/login",method = RequestMethod.GET)
    boolean Login(@RequestParam("username") String username, @RequestParam("password") String password);
}

5.2 컨트롤러 

package com.cloud.controller;



import com.cloud.pojo.User;
import com.cloud.client.LoginClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;

@RestController
@RequestMapping("/webs")

public class LoginController {

    @Autowired
    private LoginClient loginClient;

    @RequestMapping(value = "/login", method = RequestMethod.POST)
    public String Login(HttpServletRequest request){
        //System.out.println("ok");
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        System.out.println("请求中username=:"+username);
        User user=new User(username,password);
        System.out.println("读取请求参数构造的user对象:"+user);
        System.out.println("读取请求参数构造的user对象的username:"+user.getUsername());
        if(loginClient.Login(user.getUsername(),user.getPassword())){
            return "success";
        }
        return "failed";
    }


}

6. 마이크로서비스

6.1컨트롤러

package com.study.springcloud.systemmanagement.controller;

import com.cloud.pojo.User;
import com.study.springcloud.systemmanagement.service.LoginService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;

@RestController
@RequestMapping
public class LoginController {

    @Autowired
    private LoginService loginService;

    //@RequestMapping(value = "/login", method = RequestMethod.GET)
    @RequestMapping(value = "/login",method = RequestMethod.GET)
    @ResponseBody
    public boolean login(String username,String password) {
//        System.out.println("传给微服务的user:"+user);
//        System.out.println("传给微服务的user的username:"+user.getUsername());
        System.out.println("传给微服务的username:"+username);
        User user_result = this.loginService.login(username, password);
        //System.out.println(user_result);
        return user_result != null;

    }
}




6.2서비스

package com.study.springcloud.systemmanagement.service;

import com.cloud.pojo.User;

public interface LoginService {
    User login(String username, String password);
}

6.3서비스 인스턴스화

package com.study.springcloud.systemmanagement.controller;

import com.cloud.pojo.User;
import com.study.springcloud.systemmanagement.service.LoginService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;

@RestController
@RequestMapping
public class LoginController {

    @Autowired
    private LoginService loginService;

    //@RequestMapping(value = "/login", method = RequestMethod.GET)
    @RequestMapping(value = "/login",method = RequestMethod.GET)
    @ResponseBody
    public boolean login(String username,String password) {
//        System.out.println("传给微服务的user:"+user);
//        System.out.println("传给微服务的user的username:"+user.getUsername());
        System.out.println("传给微服务的username:"+username);
        User user_result = this.loginService.login(username, password);
        //System.out.println(user_result);
        return user_result != null;

    }
}




6.4 다오

package com.study.springcloud.systemmanagement.dao;

import com.cloud.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

@Mapper
public interface UserDao {

    User login(@Param("username") String username, @Param("password") String password);
}

6.5 매퍼.XML 

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.study.springcloud.systemmanagement.dao.UserDao">

    <resultMap id="userMap" type="User">
        <result property="username" column="username"/>
        <result property="password" column="password"/>
    </resultMap>

    <select id="login" resultMap="userMap">
        select username,password
        from user
        where username =#{username} and password =#{password}
    </select>


</mapper>

6. Postman을 이용한 프로젝트 운영 및 검증

세 가지 서비스를 모두 시작할 수 있습니다.

우편 배달부 테스트

콘솔에 출력된 정보도 정상입니다

 

 7. 요약

springboot, springcloud 아키텍처, 각 컴포넌트의 기능에 대해 사전에 이해하고 공통 의존성을 이해한 후 빌드를 시도하는 것이 가장 좋습니다.

다음은 작성자 개인의 이해이므로 정정 부탁드립니다.

빌드할 때 각 구성 파일의 매개변수를 자신의 것으로 변경하는 데 주의하십시오.

오류를 방지하려면 통합 버전의 관리 도구를 사용하는 것이 가장 좋습니다.

 인내심을 가지십시오. 시작은 어렵습니다.

저자는 빌드할 때 많은 실수를 겪었고 단계별로 해결했습니다.

예를 들어, mapper.xml 구성의 dao 경로가 잘못되었습니다(오류가 보고되지 않으며 찾기 어렵습니다).

EnableFeignClients 주석은 버전이 호환되지 않기 때문에 FeignClient를 스캔할 수 없으며 프로젝트의 전체 리팩토링과 각 모듈의 통합 버전 후에만 프로젝트를 해결할 수 있습니다(Springboot 및 Springcloud 구성 요소에도 호환성 문제가 있음).

Feign이 마이크로 서비스에 매개 변수를 전달할 때 FeignClient의 메서드 매개 변수가 기본값이고 기본 원칙이 아직 알려지지 않았기 때문에 값을 전달할 수 없습니다.

Acho que você gosta

Origin blog.csdn.net/wjqsm/article/details/123479905
Recomendado
Clasificación