1、服务治理概念
在传统rpc远程调用中,服务与服务依赖关系,管理比较复杂,所以需要使用服务治理,管理服务与服务之间依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册。
2、服务的注册与发现概念
在服务注册与发现中,有一个注册中心,当服务器启动的时候,会把当前自己服务器的信息 比如 服务地址通讯地址等以别名方式注册到注册中心上。
另一方(消费者|服务提供者),以该别名的方式去注册中心上获取到实际的服务通讯地址,让后在实现本地rpc调用远程。
3、什么是Eureka
Netflix在设计Euraka时遵守的就是AP原则
4、Eureka的基本架构
Eureka包含两个组件:Eureka Server和Eureka Client
Eureka Server提供服务
各节点启动服务后,会在EurekaServer中进行注册,这样EurekaServer中的服务注册表中
将会存储到所有可用服务节点的信息,服务节点信息可以在界面中直观的看到
Eureka Client是一个java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的,使用轮询(round-robin)负载算法的负载均衡器.在应用启动后,将会向Eureka Server发送心跳(默认周期为30s).
如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,EurekaServer将会从服务注册表中把这个服务节点移除(默认90s)
5、Eureka 三大角色
Eureka Server提供服务注册和发现
Service Provider服务提供方将自身服务注册到Eureka,从而是服务消费方能够找到
Service Consumer服务消费方从Eureka获取注册服务列表,从而能够消费服务
6、服务提供者与消费关系
服务提供者:提供服务被人调用
消费者:调用被人服务
7、盘点下目前的工作情况
总父工程
通用模块api
服务提供者Provider
服务消费者Consumer
8、微服务构建案例工程模块
构建步骤
1、microservicecloud整体父工程Project
新建父工程microservicecloud,切记为Packaging是pom模式,主要是定义pom文件,将后续各个子模块公用的jar包等统一提出来,类似一个抽象的父类
pom文件:
<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>
<springcloud-version>Finchley.SR1</springcloud-version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${springcloud-version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.0.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.0.4</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.31</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
2、microservicecloud-api公共子模块Module
新建microservicecloud-api
创建完成后请回到父工程查看pom文件变化如下图所示:
pom文件
<dependencies><!-- 当前Module需要用到的jar包,按自己需求添加,如果父类已经包含了,可以不用写版本号 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
新建部门Entity且配合lombok使用
@AllArgsConstructor//全参数构造
@NoArgsConstructor//无参数构造器
@Data//get set 方法
@Accessors(chain = true)//链式风格
public class Dept implements Serializable {
private Long deptno; // 主键
private String dname; // 部门名称
private String db_source;// 来自那个数据库,因为微服务架构可以一个服务对应一个数据库,同一个信息被存储到不同数据库
}
mvn clean install 后给其他模块引用,达到通用的目的,也即需要用到部门实体的话,不用每个都定义一份直接引用本模块即可
3、microservicecloud-provider-dept-8001部门微服务提供者Module
新建一个microservicecloud-provider-dept-8001,创建完成后请回到父工程查看pom文件变化如下图所示:
pom文件
<dependencies>
<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-starter-jetty</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-test</artifactId>
</dependency>
<!-- 引入自己定义的api通用包,可以使用Dept部门Entity -->
<dependency>
<groupId>com.yehui</groupId>
<artifactId>microservicecloud-api</artifactId>
<version>${project.version}</version>
<scope>compile</scope>
</dependency>
</dependencies>
application.yml文件
server:
port: 8001
mybatis:
config-location: classpath:mybatis/mybatis.cfg.xml # mybatis配置文件所在路径
type-aliases-package: com.yehui.entity # 所有Entity别名类所在包
mapper-locations: classpath:mybatis/mapper/**/*.xml # mapper映射文件
spring:
application:
name: microservicecloud-dept
datasource:
type: com.alibaba.druid.pool.DruidDataSource # 当前数据源操作类型
driver-class-name: org.gjt.mm.mysql.Driver # mysql驱动包
url: jdbc:mysql://localhost:3306/clouddb01 # 数据库名称
username: root
password: root
dbcp2:
min-idle: 5 # 数据库连接池的最小维持连接数
initial-size: 5 # 初始化连接数
max-total: 5 # 最大连接数
max-wait-millis: 200 # 等待连接获取的最大超时时间
工程src/main/resources目录下新建mybatis文件夹后新建mybatis.cfg.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!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>
mysql创建部门sql脚本
DROP TABLE IF EXISTS `dept`;
CREATE TABLE `dept` (
`deptno` BIGINT(20) NOT NULL DEFAULT 0,
`dname` VARCHAR(60) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`db_source` VARCHAR(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL
) ENGINE = INNODB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = COMPACT;
INSERT INTO `dept` VALUES (1, '开发部', 'clouddb01');
INSERT INTO `dept` VALUES (2, '人事部', 'clouddb01');
INSERT INTO `dept` VALUES (3, '财务部', 'clouddb01');
INSERT INTO `dept` VALUES (4, '市场部', 'clouddb01');
INSERT INTO `dept` VALUES (5, '运维部', 'clouddb01');
DeptMapper部门接口
@Mapper
public interface DeptMapper {
public boolean addDept(Dept dept);
public Dept findById(Long id);
public List<Dept> findAll();
}
工程src/main/resources/mybatis目录下新建mapper文件夹后在建立DeptMapper.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.yehui.mapper.DeptMapper">
<select id="findById" resultType="Dept" parameterType="Long">
select deptno,dname,db_source from dept where deptno=#{deptno};
</select>
<select id="findAll" resultType="Dept">
select deptno,dname,db_source from dept;
</select>
<insert id="addDept" parameterType="Dept">
INSERT INTO dept(dname,db_source) VALUES(#{dname},DATABASE());
</insert>
</mapper>
DeptService部门服务接口
public interface DeptService {
public boolean addDept(Dept dept);
public Dept findById(Long id);
public List<Dept> findAll();
}
DeptServiceImpl部门服务接口实现类
@Service
public class DeptServiceImpl implements DeptService {
@Autowired
private DeptMapper deptMapper;
@Override
public boolean addDept(Dept dept) {
return deptMapper.addDept(dept);
}
@Override
public Dept findById(Long id) {
return deptMapper.findById(id);
}
@Override
public List<Dept> findAll() {
return deptMapper.findAll();
}
}
DeptController部门微服务提供者REST
@RestController
@RequestMapping("/dept")
public class DeptController {
@Autowired
private DeptService deptService;
@RequestMapping(value = "/addDept")
public boolean addDept(Dept dept) {
return deptService.addDept(dept);
}
@RequestMapping("/findById/{id}")
public Dept findById(@PathVariable("id") Long id) {
return deptService.findById(id);
}
@RequestMapping("/findAll")
public List<Dept> findAll() {
return deptService.findAll();
}
}
主启动类
@SpringBootApplication
public class ProviderAppStart8001 {
public static void main(String[] args) {
SpringApplication.run(ProviderAppStart8001.class);
}
}
测试
访问地址:http://localhost:8001/dept/findAll
效果如下:
4、microservicecloud-consumer-dept-80部门微服务消费者Module
新建一个microservicecloud-provider-dept-80,创建完成后请回到父工程查看pom文件变化如下图所示:
pom文件
<dependencies>
<!-- 引入自己定义的api通用包,可以使用Dept部门Entity -->
<dependency>
<groupId>com.yehui</groupId>
<artifactId>microservicecloud-api</artifactId>
<version>${project.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
yml文件
server:
port: 80