preface
This paper will introduce the process of using Eureka to build micro services, step by step from scratch. There are probably the following construction processes:
1. Rest microservice engineering construction
2. Stand alone Eureka build
3. Cluster Eureka construction steps
Through these three processes, the latter always shows the construction process of a simple Eureka micro service based on the former.
1. Rest microservice engineering construction
1.1 create a parent project first
Create an empty parent project first
The three modul es in the circle were created later. The parent project just created has nothing but POM XML file
1.2 modify xml
As a parent project, it is mainly used for unified management of maven dependencies and unified version numbers. It is also convenient to manage multiple modul es we have established. Here, we need to change pom as follows:
<?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.atguigu.cloud</groupId> <artifactId>springCloud2020</artifactId> <version>1.0-SNAPSHOT</version> <!--Parent project packaged as pom--> <packaging>pom</packaging> <!-- unified management jar Package version --> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <junit.version>4.12</junit.version> <log4j.version>1.2.17</log4j.version> <lombok.version>1.16.18</lombok.version> <mysql.version>5.1.47</mysql.version> <druid.version>1.1.21</druid.version> <mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version> </properties> <!-- After the sub module inherits, it provides the following functions: locking the version+son modlue Do not write groupId and version --> <dependencyManagement> <dependencies> <!--spring boot 2.2.2--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.2.2.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> <!--spring cloud Hoxton.SR1--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Hoxton.SR1</version> <type>pom</type> <scope>import</scope> </dependency> <!--spring cloud alibaba 2.1.0.RELEASE--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.1.0.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>${druid.version}</version> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>${mybatis.spring.boot.version}</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>${log4j.version}</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> </dependency> </dependencies> </dependencyManagement> </project>
Some points to note: change the packaging method to pom.
Also understand the role of < dependency Management > and < / dependencies >: maven uses dependency management to provide a way to manage dependent version numbers in POM Using the dependency management element in XML can make it unnecessary to explicitly list the version number when introducing dependencies in all subprojects. maven looks up the dependency management along the parent-child hierarchy and uses the dependent version number declared in it.
Dependency management only declares dependencies and does not implement the introduction. Therefore, the subproject also needs to display the dependencies required by the declaration
The advantage of this is: if multiple subprojects reference the same dependency, you can avoid declaring a version number in each used subproject. When you want to upgrade or switch to another version, you only need to update it in the top-level parent container without modifying one subproject l; In addition, if a subproject needs another version, just declare the version version
1.3 creating a service provider
Create a module sub project under the parent project as the service provider cloud provider payment8001:
This sub project is relatively simple. The created project structure is shown in the figure above. It is just an ordinary addition, deletion, modification and query. There is nothing to say.
yml configuration:
server: port: 8001 datasource: #Current data source operation type type: com.alibaba.druid.pool.DruidDataSource #mysql driver package driver-class-name: org.gjt.mm.mysql.Driver url: jdbc:mysql://localhost:3306/cloud2020?useUnicode=true&characterEncoding=utf8&useSSL=false username: root password: 123456 mybatis: mapperLocations: classpath:mapper/*.xml #Package of all entity alias classes type-aliases-package: com.george.springcloud.entities
pom.xml:
<?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>springCloud2020</artifactId> <groupId>com.atguigu.cloud</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>Cloud-provider-payment8001</artifactId> <dependencies> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/com.alibaba/druid --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.10</version> </dependency> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-jdbc --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>com.atguigu.cloud</groupId> <artifactId>cloud-api-commons</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> </project>
Create process: create module - > change POM - > create YML - > create main startup class
Test results:
1.4 creating service consumers
The same creation process: create module - > change POM - > create YML - > create main startup class
yml:
server: port: 80
pom.xml:
<?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>springCloud2020</artifactId> <groupId>com.atguigu.cloud</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>cloud-consumer-order80</artifactId> <dependencies> <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>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>com.atguigu.cloud</groupId> <artifactId>cloud-api-commons</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> </project>
Serving consumers is also relatively simple. The following points need to be paid attention to:
Configuration class to be created:
@Configuration public class ApplicationContextConfig { @Bean public RestTemplate restTemplate() { return new RestTemplate(); } }
Registering our RestTemplate in the container is a template method provided by spring to call the micro service interface, which is responsible for calling our consumers.
Use the following:
@RestController @Slf4j public class OrderController { public static final String PAYMENT_URL = "http://localhost:8001"; @Resource private RestTemplate restTemplate; @GetMapping(value = "/consumer/payment/create") public CommonResult<Payment> create(Payment payment) { return restTemplate.postForObject(PAYMENT_URL + "/payment/create", payment, CommonResult.class); } @GetMapping("/consumer/payment/get/{id}") public CommonResult<Payment> getPayment(@PathVariable("id") Long id) { return restTemplate.getForObject(PAYMENT_URL + "/payment/get/" + id, CommonResult.class); } }
Test results:
1.5 public package
In order to prevent misunderstanding, I also posted this sub project
This project only stores some public entity classes for consumers and providers. It does not need to configure yml and startup classes. It only needs to be packaged into the warehouse and introduce dependencies where needed.
Summary
In this way, even if the first process is built. At present, the Rest microservice project is relatively simple, but it has nothing to do with Eureka. It is the basis for building later.
Finally, let's add a point. Let's look back at the pom of the parent project:
With the creation of our subprojects, there will be more and more module s here. Let's have a look.