SpringCloud-Eureka服务中心

SpringCloud-Eureka服务中心

第一部分、SpringCloud的核心组件

​ Spring Cloud 生态圈中的组件,按照发展可以分为第一代 Spring Cloud组件和第二

代 Spring Cloud组件。

第一代 Spring Cloud(Netflix,SCN)第二代 Spring Cloud(主要就是 Spring Cloud Alibaba,SCA)
注册中心Netflix Eureka阿里巴巴 Nacos
客户端负载均 衡Netflix Ribbon阿里巴巴 Dubbo LB、Spring Cloud Loadbalancer
熔断器Netflix Hystrix阿里巴巴 Sentinel
网关Netflix Zuul:性能一般,未来将退出Spring Cloud 生态圈官方 Spring Cloud Gateway
配置中心官方 Spring Cloud Config阿里巴巴 Nacos、携程 Apollo
服务调用Netflix Feign阿里巴巴 Dubbo RPC
消息驱动官方 Spring Cloud Stream
链路追踪官方 Spring Cloud Sleuth/Zipkin
阿里巴巴 seata 分布式事务方案

SpringCloud体系结构
在这里插入图片描述
​ Spring Cloud中的各组件协同工作,才能够支持一个完整的微服务架构。比如:

  • 注册中心负责服务的注册与发现,很好将各服务连接起来
  • API网关负责转发所有外来的请求
  • 断路器负责监控服务之间的调用情况,连续多次失败进行熔断保护。
  • 配置中心提供了统一的配置信息管理服务,可以实时的通知各个服务获取最新的配置信息

第二部分、SpringCloud案例搭建

第1节、Eureka服务注册中心

1.1 服务注册中心Eureka

在这里插入图片描述
Eureka 包含两个组件:Eureka Server 和 Eureka Client,Eureka Client是一个 Java客户端,用于简化与Eureka Server的交互;Eureka Server提供服务发现的 能力,各个微服务启动时,会通过Eureka Client向Eureka Server 进行注册自己 的信息(例如网络信息),Eureka Server会存储该服务的信息;

1)图中us-east-1c、us-east-1d,us-east-1e代表不同的区也就是不同的机房

2)图中每一个Eureka Server都是一个集群。

3)图中Application Service作为服务提供者向Eureka Server中注册服务, Eureka Server接受到注册事件会在集群和分区中进行数据同步,Application Client作为消费端(服务消费者)可以从Eureka Server中获取到服务注册信 息,进行服务调用。

4)微服务启动后,会周期性地向Eureka Server发送心跳(默认周期为30秒) 以续约自己的信息

5)Eureka Server在一定时间内没有接收到某个微服务节点的心跳,Eureka Server将会注销该微服务节点(默认90秒)

6)每个Eureka Server同时也是Eureka Client,多个Eureka Server之间通过复 制的方式完成服务注册列表的同步

7)Eureka Client会缓存Eureka Server中的信息。即使所有的Eureka Server节 点都宕掉,服务消费者依然可以使用缓存中的信息找到服务提供者

Eureka通过心跳检测、健康检查和客户端缓存等机制,提高系统的灵活性、可 伸缩性和可用性。

1.2 搭建单例Eureka Server服务注册中心
1.2.1 创建父工程lagou-parent
  • pom.xml中引入依赖

    <?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.lagou.edu</groupId>
        <artifactId>lagou-parent</artifactId>
        <version>1.0-SNAPSHOT</version>
        <modules>
            <module>lagou-service-resume</module>
            <module>lagou-service-common</module>
            <module>lagou-service-autodeliver</module>
            <module>lagou-cloud-eureka-server-8120</module>
        </modules>
        <!--父工程打包方式为pom-->
        <packaging>pom</packaging>
        <!--spring boot 父启动器依赖-->
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.1.6.RELEASE</version>
        </parent>
    
        <dependencyManagement>
            <dependencies>
                <!--spring cloud依赖管理,引入了Spring Cloud的版本-->
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>Greenwich.RELEASE</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
        <dependencies>
            <!--web依赖-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
                <!--日志依赖--> <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </dependency>
                <!--测试依赖--> <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
                <!--lombok工具--> <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.18.4</version>
                <scope>provided</scope>
            </dependency>
                <!-- Actuator可以帮助你监控和管理Spring Boot应用-->
                <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
                <!--热部署--> <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <optional>true</optional>
            </dependency>
    
            <!--引入Jaxb,开始-->
            <dependency>
                <groupId>com.sun.xml.bind</groupId>
                <artifactId>jaxb-core</artifactId>
                <version>2.2.11</version>
            </dependency>
                <dependency>
                    <groupId>javax.xml.bind</groupId>
                    <artifactId>jaxb-api</artifactId>
                </dependency>
                <dependency>
                <groupId>com.sun.xml.bind</groupId>
                <artifactId>jaxb-impl</artifactId>
                <version>2.2.11</version>
    
                </dependency>
            <dependency>
                <groupId>org.glassfish.jaxb</groupId>
                <artifactId>jaxb-runtime</artifactId>
                <version>2.2.10-b140310.1920</version>
            </dependency>
            <dependency>
                <groupId>javax.activation</groupId>
                <artifactId>activation</artifactId>
                <version>1.1.1</version>
            </dependency>
            <!--引入Jaxb,结束-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-commons</artifactId>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
            <!--编译插件-->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <configuration>
                        <source>8</source>
                        <target>8</target>
                        <encoding>utf-8</encoding>
                    </configuration>
                </plugin>
            <!--打包插件-->
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    </project>
    
1.2.2 创建Eureka服务注册中心module
  • pom.xml中引入依赖

    <?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>lagou-parent</artifactId>
            <groupId>com.lagou.edu</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>lagou-cloud-eureka-server-8120</artifactId>
    
    
        <dependencies>
            <!--Eureka server依赖-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
            </dependency>
        </dependencies>
    
    </project>
    
  • application.yml配置

    server:
      port: 8120
    spring:
      application:
        name: lagou-cloud-eureka-server # 应用名称,会在Eureka中作为服务的id标识(serviceId)
    eureka:
      instance:
        hostname: localhost
      client:
        service-url: # 客户端与EurekaServer交互的地址,如果是集群,也需要写其它Server的地址
          defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
        register-with-eureka: false # 自己就是服务不需要注册自己
        fetch-registry: false #自己就是服务不需要从Eureka Server获取服务信息,默认为true,置为false
    
  • SpringBoot启动类

    使用@EnableEurekaServer声明当前项目为EurekaServer 服务

    package com.lagou.edu;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
    
    /**
     * @author izhouy
     * @title LagouCloudEurekaServerApplication
     * @Decription 启动类
     * @CreateDate 2021/3/25 09:39
     */
    @SpringBootApplication
    // 声明本项目是一个Eureka服务
    @EnableEurekaServer
    public class LagouCloudEurekaServerApplication {
        public static void main(String[] args) {
            SpringApplication.run(LagouCloudEurekaServerApplication.class, args);
        }
    }
    
1.2.3 执行启动类LagouCloudEurekaServerApplication的main函数
  • 访问http://localhost:8120/,如果看到如下⻚面(Eureka注册中心后台),则表 明EurekaServer发布成功
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
1.3 搭建Eureka Server HA高可用集群

Eureka高可用集群
在这里插入图片描述

1.3.1 修改本机host属性
sudo vim /etc/hosts

127.0.0.1 LagouCloudEurekaServerA
127.0.0.1 LagouCloudEurekaServerB
1.3.2 copy一个lagou-cloud-eureka-server工程

​ lagou-cloud-eureka-server-8121

1.3.3 修改pom.xml、application.yml、SpringBoot启动类
  • pom.xml

    8121的pom.xml

<?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>lagou-parent</artifactId>
        <groupId>com.lagou.edu</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>lagou-cloud-eureka-server-8121</artifactId>


    <dependencies>
        <!--Eureka server依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>

</project>

​ 父工程pom.xml

<modules>
    <module>lagou-service-resume</module>
    <module>lagou-service-common</module>
    <module>lagou-service-autodeliver</module>
    <module>lagou-cloud-eureka-server-8120</module>
    <module>lagou-cloud-eureka-server-8121</module>
</modules>
  • application.yml

    8120的application.yml

    server:
      port: 8120
    spring:
      application:
        name: lagou-cloud-eureka-server # 应用名称,会在Eureka中作为服务的id标识(serviceId)
    eureka:
      instance:
        hostname: LagouCloudEurekaServerA
      client:
        service-url: # 客户端与EurekaServer交互的地址,如果是集群,也需要写其它Server的地址
          defaultZone: http://LagouCloudEurekaServerB:8121/eureka/
        register-with-eureka: true # 自己就是服务不需要注册自己
        fetch-registry: true #自己就是服务不需要从Eureka Server获取服务信息,默认为true,置为false
    

    8121的application.yml

    server:
      port: 8121
    spring:
      application:
        name: lagou-cloud-eureka-server # 应用名称,会在Eureka中作为服务的id标识(serviceId)
    eureka:
      instance:
        hostname: LagouCloudEurekaServerB
      client:
        service-url: # 客户端与EurekaServer交互的地址,如果是集群,也需要写其它Server的地址
          defaultZone: http://LagouCloudEurekaServerA:8120/eureka/
        register-with-eureka: true # 自己就是服务不需要注册自己
        fetch-registry: true #自己就是服务不需要从Eureka Server获取服务信息,默认为true,置为false
    
  • 启动两个Eureka注册中心

    访问http://LagouCloudEurekaServerA:8120/,http://LagouCloudEurekaServerB:8121/如果看到如下⻚面(Eureka注册中心后台),则表 明EurekaServer发布成功
    在这里插入图片描述
    在这里插入图片描述

1.4 微服务注册到EurekaServer
1.4.1 创建common公共module
  • pom.xml中引入依赖
<?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>lagou-parent</artifactId>
        <groupId>com.lagou.edu</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.lagou.edu</groupId>
    <artifactId>lagou-service-common</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!--Spring Data Jpa-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

    </dependencies>

</project>
  • 数据库脚本
CREATE TABLE `r_resume` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `sex` varchar(10) DEFAULT NULL COMMENT '性别',
  `birthday` varchar(30) DEFAULT NULL COMMENT '出生日期',
  `workYear` varchar(100) DEFAULT NULL COMMENT '工作年限',
  `phone` varchar(20) DEFAULT NULL COMMENT '手机号码',
  `email` varchar(100) DEFAULT NULL COMMENT '邮箱',
  `status` varchar(80) DEFAULT NULL COMMENT '目前状态',
  `resumeName` varchar(500) DEFAULT NULL COMMENT '简历名称',
  `name` varchar(40) DEFAULT NULL,
  `createTime` datetime DEFAULT NULL COMMENT '创建日期',
  `headPic` varchar(100) DEFAULT NULL COMMENT '头像',
  `isDel` int(2) DEFAULT NULL COMMENT '是否删除 默认值0-未删除 1-已删除',
  `updateTime` datetime DEFAULT NULL COMMENT '简历更新时间',
  `userId` int(11) DEFAULT NULL COMMENT '用户ID',
  `isDefault` int(2) DEFAULT NULL COMMENT '是否为默认简历 0-默认 1-非默认',
  `highestEducation` varchar(20) DEFAULT '' COMMENT '最高学历',
  `deliverNearByConfirm` int(2) DEFAULT '0' COMMENT '投递附件简历确认 0-需要确认 1-不需要确认',
  `refuseCount` int(11) NOT NULL DEFAULT '0' COMMENT '简历被拒绝次数',
  `markCanInterviewCount` int(11) NOT NULL DEFAULT '0' COMMENT '被标记为可面试次数',
  `haveNoticeInterCount` int(11) NOT NULL DEFAULT '0' COMMENT '已通知面试次数',
  `oneWord` varchar(100) DEFAULT '' COMMENT '一句话介绍自己',
  `liveCity` varchar(100) DEFAULT '' COMMENT '居住城市',
  `resumeScore` int(3) DEFAULT NULL COMMENT '简历得分',
  `userIdentity` int(1) DEFAULT '0' COMMENT '用户身份1-学生 2-工人',
  `isOpenResume` int(1) DEFAULT '3' COMMENT '人才搜索-开放简历 0-关闭,1-打开,2-简历未达到投放标准被动关闭 3-从未设置过开放简历',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2195388 DEFAULT CHARSET=utf8;
  • 实体类
package com.lagou.edu.pojo;

import lombok.Data;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
/**
 * @author izhouy
 * @title Resume
 * @Decription 实体类
 * @CreateDate 2021/3/24 22:40
 */

@Data
@Entity
@Table(name="r_resume")
public class Resume {
    @Id
    private Long id; // 主键
    private String sex; // 性别
    private String birthday; // 生日
    private String workYear; // 工作年限
    private String phone; // 手机号
    private String email; // 邮箱
    private String status; // 目前状态
    private String resumeName; // 简历名称
    private String name; // 姓名
    private String createTime; // 创建时间
    private String headPic; // 头像
    private Integer isDel; //是否删除 默认值0-未删除 1-已删除 private String updateTime; // 简历更新时间
    private Long userId; // 用户ID
    private Integer isDefault; // 是否为默认简历 0-默认 1-非默认 private String highestEducation; // 最高学历
    private Integer deliverNearByConfirm; // 投递附件简历确认 0-需要确认 1-不需要确认
    private Integer refuseCount; // 简历被拒绝次数
    private Integer markCanInterviewCount; //被标记为可面试次数 private Integer haveNoticeInterCount; //已通知面试次数
    private String oneWord; // 一句话介绍自己
    private String liveCity; // 居住城市
    private Integer resumeScore; // 简历得分
    private Integer userIdentity; // 用户身份1-学生 2-工人
    private Integer isOpenResume; // 人才搜索-开放简历 0-关闭,1-打开,2-简历未达到投放标准被动关闭 3-从未设置过开放简历

}
1.4.2 服务提供者module
  • pom.xml中引入依赖
<?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>lagou-parent</artifactId>
        <groupId>com.lagou.edu</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.izhouy</groupId>
    <artifactId>lagou-service-resume</artifactId>

    <dependencies>
        <!--添加对common工程的依赖-->
        <dependency>
            <groupId>com.lagou.edu</groupId>
            <artifactId>lagou-service-common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    </dependencies>
</project>
  • application.yml配置
server:
  port: 8110 # 后期该微服务多实例,端口从8080递增(10个以内)
spring:
  application:
    name: lagou-service-resume
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/lagou?useUnicode=true&characterEncoding=utf8
    username: root
    password: root
  jpa:
    database: MySQL
    show-sql: true
    hibernate:
      naming:
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
#避免将驼峰命名转换为下划线命名
eureka:
  client:
    service-url: # eureka server的路径 defaultZone:
      #把 eureka 集群中的所有 url 都填写了进来,也可以只写一台,因为各个 eureka server 可以同步注册表
      defaultZone: http://lagoucloudeurekaservera:8120/eureka/,http://lagoucloudeurekaserverb:8121/eureka/
  instance:
    #使用ip注册,否则会使用主机名注册了(此处考虑到对老版本的兼容,新版本经过实验都是ip)
    prefer-ip-address: true
    #自定义实例显示格式,加上版本号,便于多版本管理,注意是ip-address,早期版本是ipAddress
    instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}:@project.version@
  • SpringBoot启动类
package com.lagou.edu;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**
 * @author izhouy
 * @title LagouResumeApplication8110
 * @Decription 启动类
 * @CreateDate 2021/3/24 22:47
 */
@SpringBootApplication
@EntityScan("com.lagou.edu.pojo")
@EnableDiscoveryClient
public class LagouResumeApplication8110 {

    public static void main(String[] args) {
        SpringApplication.run(LagouResumeApplication8110.class, args);
    }
}
  • Dao层接口
package com.lagou.edu.dao;

import com.lagou.edu.pojo.Resume;
import org.springframework.data.jpa.repository.JpaRepository;
public interface ResumeDao extends JpaRepository<Resume,Long> {

}
  • Service层接口和实现类

接口

package com.lagou.edu.service;

import com.lagou.edu.pojo.Resume;
public interface ResumeService {
    Resume findDefaultResumeByUserId(Long userId);
}

实现类

package com.lagou.edu.service.impl;

import com.lagou.edu.dao.ResumeDao;
import com.lagou.edu.pojo.Resume;
import com.lagou.edu.service.ResumeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Example;
import org.springframework.stereotype.Service;
import com.lagou.edu.dao.ResumeDao;
import com.lagou.edu.pojo.Resume;
import com.lagou.edu.service.ResumeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Optional;

/**
 * @author izhouy
 * @title ResumeServiceImpl
 * @Decription
 * @CreateDate 2021/3/24 22:44
 */

@Service
public class ResumeServiceImpl implements ResumeService {
    @Autowired
    private ResumeDao resumeDao;
    @Override
    public Resume findDefaultResumeByUserId(Long userId) {
        Resume resume = new Resume();
        resume.setUserId(userId);
        // 查询默认简历
        resume.setIsDefault(1);
        Example<Resume> example = Example.of(resume);
        return resumeDao.findOne(example).get();
    }
}
  • Controller控制层
package com.lagou.edu.controller;

import com.lagou.edu.service.ResumeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author izhouy
 * @title ResumeController
 * @Decription
 * @CreateDate 2021/3/24 22:45
 */
@RestController
@RequestMapping("/resume")
public class ResumeController {
    @Autowired
    private ResumeService resumeService;

    //"/resume/openstate/1545132"
    @GetMapping("/openstate/{userId}")
    public Integer findDefaultResumeState(@PathVariable Long userId) {
        return resumeService.findDefaultResumeByUserId(userId).getIsOpenResume();
    }
}
1.4.3 创建消费者module
  • pom.xml中引入依赖
<?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>lagou-parent</artifactId>
        <groupId>com.lagou.edu</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>lagou-service-autodeliver</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    </dependencies>
</project>
  • application.yml配置
server:
  port: 8111 # 后期该微服务多实例,端口从8090递增(10个以内)
spring:
  application:
    name: lagou-service-autodeliver
eureka:
  client:
    service-url:
      #把 eureka 集群中的所有 url 都填写了进来,也 可以只写一台,因为各个 eureka server 可以同步注册表
      defaultZone: http://lagoucloudeurekaservera:8120/eureka/,http://lagoucloudeurekaserverb:8121/eureka/
  instance:
    #使用ip注册,否则会使用主机名注册了(此处考虑到对老版本的兼容,新版本经过实验都是ip)
    prefer-ip-address: true
    #自定义实例显示格式,加上版本号,便于多版本管理,注意是ip-address,早期版本是ipAddress
    instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}:@project.version@
  • SpringBoot启动类
package com.lagou.edu;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

/**
 * @author izhouy
 * @title AutodeliverApplication
 * @Decription
 * @CreateDate 2021/3/24 23:40
 */
@SpringBootApplication
@EnableDiscoveryClient
public class AutodeliverApplication {
    public static void main(String[] args) {
        SpringApplication.run(AutodeliverApplication.class, args);
    }
    /**
     * 注入RestTemplate * @return
     */
    @Bean
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}
  • Controller控制层
package com.lagou.edu.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

/**
 * @author izhouy
 * @title AutodeliverController
 * @Decription
 * @CreateDate 2021/3/24 23:39
 */

@RestController
@RequestMapping("/autodeliver")
public class AutodeliverController {
    @Autowired
    private RestTemplate restTemplate;
    
    /**
     * 直接调用
     * @param userId
     * @return java.lang.Integer
     * @title AutodeliverController-findResumeOpenState
     * @CreateDate 2021/3/25 11:20
     * @author izhouy
     */
    @GetMapping("/checkState/{userId}")
    public Integer findResumeOpenState(@PathVariable Long userId) {
        Integer forObject = restTemplate.getForObject("http://localhost:8110/resume/openstate/" + userId, Integer.class);
        System.out.println("======>>>调用简历微服务,获取到用户" + userId + "的默认简历当前状态为:" + forObject);
        return forObject;
    }
}
1.5 微服务消费者调用服务提供者(通过Eureka)
package com.lagou.edu.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.List;

/**
 * @author izhouy
 * @title AutodeliverController
 * @Decription
 * @CreateDate 2021/3/24 23:39
 */

@RestController
@RequestMapping("/autodeliver")
public class AutodeliverController {
    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private DiscoveryClient discoveryClient;

    /**
     * 直接调用
     * @param userId
     * @return java.lang.Integer
     * @title AutodeliverController-findResumeOpenState
     * @CreateDate 2021/3/25 11:20
     * @author izhouy
     */
    @GetMapping("/checkState/{userId}")
    public Integer findResumeOpenState(@PathVariable Long userId) {
        Integer forObject = restTemplate.getForObject("http://localhost:8110/resume/openstate/" + userId, Integer.class);
        System.out.println("======>>>调用简历微服务,获取到用户" + userId + "的默认简历当前状态为:" + forObject);
        return forObject;
    }

    @GetMapping("/checkAndBegin/{userId}")
    public Integer findResume(@PathVariable Long userId){
        List<ServiceInstance> instances = discoveryClient.getInstances("lagou-service-resume");
        ServiceInstance serviceInstance = instances.get(0);
        String host = serviceInstance.getHost();
        int port = serviceInstance.getPort();
        String utl = "http://"+host+":"+port+"/resume/openstate/"+userId;
        Integer forObject = restTemplate.getForObject(utl, Integer.class);
        System.out.println("======>>>调用简历微服务,获取到用户" + userId + "的默认简历当前状态为:" + forObject);
        return forObject;
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值