SpringCloud 服务的注册与发现(Eureka)

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

猜你喜欢

转载自www.cnblogs.com/cxyyh/p/10634319.html