SpringCloud
创建项目
父项目
新建一个普通maven项目,作为父项目。
删掉多余的目录(src、test等),只剩下pom.xml文件。在其中添加如下配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
|
<?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.qsdbl</groupId> <artifactId>springcloud</artifactId> <version>1.0-SNAPSHOT</version> <modules> <module>springcloud-api</module> </modules>
<packaging>pom</packaging>
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target>
<logback.version>1.2.3</logback.version> <junit.version>4.12</junit.version> <lombok.version>1.16.18</lombok.version> <log4j.version>1.2.17</log4j.version> </properties>
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Greenwich.SR1</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.1.4.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.25</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.10</version> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.2</version> </dependency>
<dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>${logback.version}</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>${log4j.version}</version> </dependency> </dependencies> </dependencyManagement>
</project>
|
子模块1-服务提供者
新建一个普通maven项目,作为子模块。
- 项目名为:springcloud-api
- 项目类型:甚至没有main方法,仅仅提供实体类
- 子模块提供的服务是:提供Account账户表的实体类
项目结构
![]()
pom文件
在pom.xml文件中,引入如下依赖(注意不带版本号,因为父项目中已经设置):lombok、swagger
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
|
<?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>springcloud</artifactId> <groupId>com.qsdbl</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion>
<artifactId>springcloud-api</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> </dependency>
<dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> </dependency> <dependency> <groupId>io.swagger</groupId> <artifactId>swagger-models</artifactId> </dependency> </dependencies> </project>
|
实体类
编写实体类。使用到lombok、swagger的注解。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
|
package com.qsdbl.springcloud.entity;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; import java.io.Serializable;
@Data @AllArgsConstructor @NoArgsConstructor @Accessors(chain = true) @ApiModel("账号表") public class Account implements Serializable { @ApiModelProperty("用户名") private String username; @ApiModelProperty("密码") private String password; @ApiModelProperty("数据库名 - 数据来源,记录这个数据是存在哪个数据库中的字段。微服务,一个服务对应一个数据库,同一个信息可能存在不同的数据库。") private String db_source;
}
|
子模块2-服务提供者
新建一个普通maven项目,作为子模块。
- 项目名为:springcloud-provider-8001
- 项目类型:SpringBoot项目(正常编写SpringBoot项目即可)
- 子模块提供的服务是:对Account账户表的数据进行CRUD(增删改查)操作
项目结构
pom文件
在pom.xml文件中,引入需要用到的依赖(注意不带版本号,因为父项目中已经设置):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
|
<?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>springcloud</artifactId> <groupId>com.qsdbl</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion>
<artifactId>springcloud-provider-8001</artifactId>
<properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties>
<dependencies>
<dependency> <groupId>com.qsdbl</groupId> <artifactId>springcloud-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-test</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-jetty</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency>
<dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> </dependency> <dependency> <groupId>io.swagger</groupId> <artifactId>swagger-models</artifactId> </dependency> <dependency> <groupId>com.zyplayer</groupId> <artifactId>swagger-mg-ui</artifactId> </dependency> </dependencies> </project>
|
springboot配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
server.port=8001
mybatis.type-aliases-package=com.qsdbl.springcloud.entity
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
spring.application.name=springcloud-provider-8001
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/cashier_system?useUnicode=true&characterEncoding=gbk&useSSL=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Hongkong
spring.datasource.username=root
spring.datasource.password=123456
|
启动类
编写启动类Provider_8001(别忘了注解@SpringBootApplication),添加main方法和调用SpringApplication.run,将普通maven项目变成一个SpringBoot项目。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
package com.qsdbl.springcloud;
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication public class Provider_8001 { public static void main(String[] args) { SpringApplication.run(Provider_8001.class,args); } }
|
子模块3-服务消费者
新建一个普通maven项目,作为子模块。
- 项目名为:springcloud-consumer-80
- 项目类型:SpringBoot项目(正常编写SpringBoot项目即可)
- 子模块提供的服务是:一般做一个整合,对其它子模块所提供的服务进行整合,对外提供访问接口(API)。
项目结构
![]()
pom文件
在pom.xml文件中,引入需要用到的依赖(注意不带版本号,因为父项目中已经设置):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
|
<?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>springcloud</artifactId> <groupId>com.qsdbl</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion>
<artifactId>springcloud-consumer-80</artifactId>
<properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties>
<dependencies> <dependency> <groupId>com.qsdbl</groupId> <artifactId>springcloud-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> </dependencies>
</project>
|
springboot配置
启动类
编写启动类Consumer_80(别忘了注解@SpringBootApplication),添加main方法和调用SpringApplication.run,将普通maven项目变成一个SpringBoot项目。
1 2 3 4 5 6 7 8 9 10 11
|
package com.qsdbl.springcloud;
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication public class Consumer_80 { public static void main(String[] args) { SpringApplication.run(Consumer_80.class,args); } }
|
Controller层
对外提供API。
-
与springBoot项目的controller有点不一样。这里没有service层调用,而是改为使用类RestTemplate。使用类RestTemplate中的方法,调用其他子模块的controller所提供的api服务。
-
其他子模块的controller中所提供的get、post、delete等等api,在RestTemplate中,为getForObject、postForObject、delete等方法去调用。
- 注意:查看RestTemplate源码,去了解所提供的各方法和相应的形参
- 其他地方与普通springBoot项目的controller相同。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
|
package com.qsdbl.springcloud.controller;
import com.qsdbl.springcloud.entity.Account; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.client.RestTemplate; import java.util.List;
@RestController public class ConsumerController { @Autowired RestTemplate restTemplate; private static final String REST_URL_PREFIX = "http://localhost:8001/springcloud-provider/v1/";
@PostMapping("/consumer/account/{username}") public int add(@RequestBody Account account){ return restTemplate.postForObject(REST_URL_PREFIX+"account/"+account.getUsername(),account,Integer.class); }
@GetMapping("/consumer/account/{id}") public Account get(@PathVariable String id){ return restTemplate.getForObject(REST_URL_PREFIX+"account/"+id,Account.class); }
@GetMapping("/consumer/accounts") public List<Account> getAll(){ return restTemplate.getForObject(REST_URL_PREFIX+"accounts",List.class); } }
|
注册bean
要使用类RestTemplate,需要将其注入spring的IOC容器中。
创建类ConfigBean(使用注解@Configuration),使用@Bean注解完成RestTemplate的注入。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
package com.qsdbl.springcloud.config;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate;
@Configuration public class ConfigBean {
@Bean public RestTemplate getRestTemplate(){ return new RestTemplate(); } }
|
Eureka
- Eureka 包含两个组件:Eureka Server 和 Eureka Client.
- Eureka Server 提供服务注册,各个节点启动后,会在EurekaServer中进行注册,这样Eureka
Server中的服务注册表中将会储存所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。
- Eureka Client
是一个Java客户端,用于简化EurekaServer的交互,客户端同时也具备一个内置的,使用轮询负载算法的负载均衡器。在应用启动后,将会向EurekaServer发送心跳
(默认周期为30秒) 。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,EurekaServer将会从服务注册表中把这个服务节点移除掉
(默认周期为90s)。
子模块4-Eureka Server
新建一个普通maven项目,作为子模块。
- 项目名为:springcloud-eureka-7001
- 项目类型:SpringBoot项目
- 子模块提供的服务是:eureka-server提供服务注册
项目结构
![]()
pom文件
在pom.xml文件中,引入需要用到的依赖(eureka-server依赖,在父项目中没有添加,所以这里要带上版本号):
1 2 3 4 5
|
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> <version>1.4.6.RELEASE</version> </dependency>
|
springboot配置
1 2 3 4 5 6 7 8 9 10 11
|
server.port=7001
eureka.instance.hostname=localhost
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka
|
启动类
编写启动类EurekaServer_7001(别忘了注解@SpringBootApplication),添加main方法和调用SpringApplication.run,将普通maven项目变成一个SpringBoot项目。添加注解@EnableEurekaServer,启用eureka-Server服务。
1 2 3 4 5 6 7 8 9 10 11 12 13
|
package com.qsdbl.springcloud;
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication @EnableEurekaServer public class EurekaServer_7001 { public static void main(String[] args) { SpringApplication.run(EurekaServer_7001.class,args); } }
|
监控页面
服务前边配置的eureka监控页面地址:http://localhost:7001
![]()
Eureka Client
对子模块2,进行修改。让其启动后,自动到Eureka Server注册。
pom文件
添加eureka依赖,向Eureka Server注册服务
1 2 3 4 5 6
|
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> <version>1.4.6.RELEASE</version> </dependency>
|
springboot配置
1 2
|
eureka.client.service-url.defaultZone=http://localhost:7001/eureka
|
扩展:修改eureka监控页面上的 描述消息
1 2
|
eureka.instance.instance-id=springcloud-provider-8001
|
启动类
添加注解@EnableEurekaClient
监控页面
启动子模块4(Eureka Server),然后再启动子模块2(Eureka Client)。查看Eureka Server的监控页面:
![]()
P7 09:13