0%

SpringCloud笔记

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>
<!--springcloud依赖。runtime改为import-->
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-dependencies -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--springboot依赖-->
<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>
<!--mybatis - springboot启动器-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<!-- 日志测试 - 相关 -->
<!--logback-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>${logback.version}</version>
</dependency>
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
<!--log4j-->
<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>

<!-- 当前module需要的依赖,若父依赖中已配置了版本,这里就不用写了-->
<!-- lombok-->
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- swagger-->
<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("账号表")//swagger注解,用于给类添加注释
public class Account implements Serializable {
@ApiModelProperty("用户名")//swagger注解,用于给类属性添加注释
private String username;
@ApiModelProperty("密码")
private String password;
@ApiModelProperty("数据库名 - 数据来源,记录这个数据是存在哪个数据库中的字段。微服务,一个服务对应一个数据库,同一个信息可能存在不同的数据库。")
private String db_source;

/**
*什么是链式写法?示例:
*
* Account a = new Account();
* 普通写法:
* a.setUsername("admin");
* a.setPassword("123");
* 链式写法:
* a.setUsername("admin").setPassword("123");
*/
}

子模块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>
<!-- 需要拿到实体类,所以配置api module-->
<dependency>
<groupId>com.qsdbl</groupId>
<artifactId>springcloud-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<!-- mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<!-- druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
<!-- logback-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</dependency>
<!-- springboot test-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
</dependency>
<!-- springboot web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- springboot jetty容器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
<!-- springboot devtools,热部署工具-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<!-- swagger-->
<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配置
#实体类所在的包
mybatis.type-aliases-package=com.qsdbl.springcloud.entity
#mapper接口对应的 xml配置文件
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
#mybatis配置文件。建议:使用该文件配置mybatis就不需要添加mybatis的配置文件了
#mybatis.config-location=classpath:mybatis/mybatis-config.xml

#spring配置:
#程序名
spring.application.name=springcloud-provider-8001
#数据源
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
#mysql驱动
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#mysql数据库
spring.datasource.url=jdbc:mysql://localhost:3306/cashier_system?useUnicode=true&characterEncoding=gbk&useSSL=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Hongkong
#mysql数据库 账号
spring.datasource.username=root
#mysql数据库 密码
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>

<!--需要的依赖:实体类 + springboot web-->
<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配置

1
server.port=80

启动类

编写启动类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 {
//理解:消费者,不应该有service层
//RestTemplate ---- 提供多种便捷访问远程http服务的方法,简单的Restful服务模板。(但是需要我们手动注册RestTemplate到spring中,见类ConfigBean)
//参数列表,(url,实体:Map,Class<T> responseType) - 获取服务的地址,提供的数据,返回的数据类型 - 根据服务类别,提供的数据可有可无
@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 {//@Configuration --相当于-- spring配置文件 applicationContext.xml

//注册bean
@Bean
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}

Eureka

  • Eureka 包含两个组件:Eureka ServerEureka 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配置
#Eureka服务端实例的地址(监控页面地址为 该地址加上上边配置的端口号,即localhost:7001)
eureka.instance.hostname=localhost
#表示 是否向Eureka注册中心注册自己
eureka.client.register-with-eureka=false
#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
<!--eureka,用于注册服务-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>

springboot配置

1
2
#Eureka配置,服务注册地址(地址为上边的子模块4中配置的)
eureka.client.service-url.defaultZone=http://localhost:7001/eureka

扩展:修改eureka监控页面上的 描述消息

1
2
#修改eureka后台页面上的 描述消息
eureka.instance.instance-id=springcloud-provider-8001

启动类

添加注解@EnableEurekaClient

1
@EnableEurekaClient//在服务启动后,自动注册到eureka中

监控页面

启动子模块4(Eureka Server),然后再启动子模块2(Eureka Client)。查看Eureka Server的监控页面:

P7 09:13

若图片不能正常显示,请在浏览器中打开

欢迎关注我的其它发布渠道