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;
}
}