SpringClould
- SpringBoot和SpringClould
- 搭建springcloud
- 创建项目管理
- 实体类模块
- 服务提供者模块
- 消费者
- Eureka 服务注册与发现
SpringBoot和SpringClould
springboot和springclould都是spring系列的衍生品,都可以在spring的官网找到对应的参考文档和学习路线以及核心技术
springboot
spring-cloud
springboot
专注于快速的,方便的,开发单体微服务,可以离开springcloud独立使用,开发项目,开发单体个体的微服务jar
springcloud
是关注于全局的服务治理框架,离不开springBoot,它将每一个springboot的单体微服务进行了整合,为各个微服务之间进行整合管理,为各个微服务之间提供配置管理,服务发现,路由,微代理,事件总线,全局锁,分布式会话等集成服务
这些版本都是以英国大写的字母所对应的街区名字命名的,快照版本不推荐使用,强烈推荐使用GA
搭建springcloud
创建项目管理
创建总的maven
工程命名为springcloud
,方便对每一个springboot
进行管理,每一个springboot
负责专一功能,不同的springboot
项目之间的联系同依赖引入即可
引包方式是pom
<packaging>pom</packaging>
属性通过properties
进行管理,统一管理相关的包的版本,方便不同插件版本的更改,比如可能存在lombok
版本过低的问题,如果你在很多的springboot
项目中导入了lombok
,版本不同的情况,修改版本费事费力。由于本机的jdk11
统一maven
编译的版本和生成目标的版本是11
,项目编码格式统一utf-8
<properties>
<junit.version>4.12</junit.version>
<lombok.version>1.18.12</lombok.version>
<log4j.version>1.2.17</log4j.version>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
创建的是包管理
<dependencyManagement>
<dependencies>
<!-- 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 的依赖以pom方式导入方便在子项目中进行管理 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.4.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- mysql 8 的驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
</dependency>
<!-- 阿里的druid数据源 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<!-- mybatis-spring-boot-starter 启动依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</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>
<!-- 日志门面 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
</dependencies>
</dependencyManagement>
实体类模块
创建模块springcloud-api
功能就只是实现一般api
的编写,比如实体类Dept
lombok
注解,开启链式编程
@Accessors(chain = true)
Dept
实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true) // 支持链式写法
public class Dept implements Serializable {
private Integer id;
private String name;
private String source;
}
观察父项目和子项目的pom
文件具有父子引用关系,父项目指定相关依赖的版本号,子项目就只需引入名称即可,不需要加版本
父项目的pom
依赖
服务提供者模块
springcloud-provider-dept-8001
负责提供服务,控制层,业务层,dao层,端口号设置为 8001
引入本模块的相关依赖
<dependencies>
<!-- 配置api的模块-->
<dependency>
<groupId>com.mao</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>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</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>
</dependencies>
mybatis-config.xml
开启二级缓存,或者在application.yml
的配置文件中也可以开启
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<!-- 开启二级缓存-->
<setting name="cacheEnabled" value="true"/>
</settings>
</configuration>
application.yml
mybatis开启二级缓存的yml配置
mybatis:
configuration:
cache-enabled: true
配置服务提供者的端口号,mybatis相关配置, spring配置,注意的是二级缓存,如果自己编写了mybatis-config.xml
配置文件在里面开启了二级缓存,在这里配置config-location: classpath:mybatis/mybatis-config.xml
即可,要想直接在application.yml
配置二级缓存,需要注释掉config-location
,在加上开启缓存的配置,否则会爆出找不到sql
工厂的错误
# 端口号配置
server:
port: 8001
# mybatis配置
mybatis:
type-aliases-package: com.mao.springclould.pojo
config-location: classpath:mybatis/mybatis-config.xml
mapper-locations: classpath:mybatis/mapper/*.xml
# spring配置
spring:
application:
name: springcloud-provider-dept
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/ems?useUnicode=true&characterEncoding=utf-8
username: root
password: 123456
Dao
层接口,@Mapper
标记是Dao
层的接口,或者直接在主启动类上加@MapperScan("com.mao.springclould.dao")
标志这个包下面的接口全部是Dao
层的接口
@Mapper
@Repository
public interface DeptDao {
public boolean addDept(Dept dept);
public Dept queryById(Integer id);
public List<Dept> queryAll();
}
Dao
编写对应的mapper.xml的SQL语句,在使用parameterType
时候,需要配置参数别名,扫描到这个pojo
的包
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mao.springclould.dao.DeptDao">
<!-- 参数别名配置到springcloud-api的pojo中-->
<insert id="addDept" parameterType="Dept">
insert into dept (name,source) values (#(name),DATABASE());
</insert>
<select id="queryById" resultType="com.mao.springclould.pojo.Dept" parameterType="Integer">
select * from dept where id = #{id};
</select>
<select id="queryAll" resultType="com.mao.springclould.pojo.Dept">
select * from dept;
</select>
</mapper>
Service
层的接口,这层接口的方法和Dao
层接口方法一模一样,只是在服务层接口的实现类上加入@Service
注解,调用低层Dao
层的代码
public interface DeptService {
public boolean addDept(Dept dept);
public Dept queryById(Integer id);
public List<Dept> queryAll();
}
Service
业务层接口的实现类,代用Dao
层
@Service
public class DeptServiceImpl implements DeptService {
@Autowired
private DeptDao deptDao;
@Override
public boolean addDept(Dept dept) {
return deptDao.addDept(dept);
}
@Override
public Dept queryById(Integer id) {
return deptDao.queryById(id);
}
@Override
public List<Dept> queryAll() {
return deptDao.queryAll();
}
}
Controller控制器层,前台浏览器端输入的请求通过controller
调用到service
在调用到dao
@RestController
public class DeptController {
@Autowired
private DeptService deptService;
@PostMapping("/dept/add")
public boolean addDept(Dept dept){
return deptService.addDept(dept);
}
@GetMapping("/dept/get/{id}")
public Dept queryById(@PathVariable("id") Integer id){
return deptService.queryById(id);
}
@GetMapping("/dept/list")
public List<Dept> queryAll(){
return deptService.queryAll();
}
}
主启动类DeptProvider_8001
@SpringBootApplication
@MapperScan("com.mao.springclould.dao")
public class DeptProvider_8001 {
public static void main(String[] args) {
SpringApplication.run(DeptProvider_8001.class,args);
}
}
测试生产者是正常运行,可以请求到数据
消费者
新建springcloud-consumer-dept-80
负责消费者模块,通过Rest
的请求模板,不同的地址实现简单RPC
通信框架
导入消费者所需要的依赖
<dependencies>
<dependency>
<groupId>com.mao</groupId>
<artifactId>springcloud-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
配置文件的编写,只需要进行一个端口号的配置即可
# 端口号配置
server:
port: 80
建立一个config
的目录,负责配置文件的管理,ConfigBean
集中管理各种Bean
@Configuration
public class ConfigBean {
@Bean
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
在controller
模块中编写DeptConsumerController
,通过自动注入的方式,进行装配restTemplate
,通过RestFul
风格的地址请求,消费者获取地址进行请求,简单的RPC
框架
@RestController
public class DeptConsumerController {
@Autowired
private RestTemplate restTemplate;
private static final String REST_URL_PREFIX = "http://localhost:8001";
@PostMapping("/consumer/dept/add")
public boolean addDept(Dept dept){
return restTemplate.postForObject(REST_URL_PREFIX+"/dept/add",dept,Boolean.class);
}
@GetMapping("/consumer/dept/get/{id}")
public Dept queryById(@PathVariable("id") Integer id){
return restTemplate.getForObject(REST_URL_PREFIX+"/dept/get/"+id, Dept.class);
}
@GetMapping("/consumer/dept/list")
public List<Dept> queryAll(){
return restTemplate.getForObject(REST_URL_PREFIX+"/dept/list", List.class);
}
}
消费端口模块的主启动类
@SpringBootApplication
public class DeptConsumer_80 {
public static void main(String[] args) {
SpringApplication.run(DeptConsumer_80.class,args);
}
}
运行与查看,先启动提供者的端口,查看生产者是否可以正常运行,再运行开启消费者的端口,注意期间生产者不能关闭,否则消费者将无法访问