学习eureka笔记
eureka就是一个spring cloud的一个组件,是负责服务的上传和调用的。也就是说我们可以将一个服务注册到eureka上去,其他的服务想去调用被注册服务的功能就可以去通过eureka代理获得这个服务。
1.服务提供者:
提供服务的项目
2.服务调用者:
调用提供者功能的项目
3.心跳
eureka通过心跳来判断这个项目是否挂掉了
搭建spring boot项目
1.搭建一个空项目。
2.在这个空项目中添加三个模块。分别为服务的提供者,调用者和eureka注册中心。
3.eureka注册中心添加相关依赖
<?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>org.example</groupId>
<artifactId>EurekaServer</artifactId>
<version>1.0-SNAPSHOT</version>
<!--上面是自动生成的不用改-->
<!--添加spring boot父工程里面都是一个常用的版本号-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.6.RELEASE</version>
</parent>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<!--因为每个spring boot版本都有相对应的版本spring cloud版本,这个就是对spring cloud版本就行约束-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!--添加spring cloud的eureka依赖,因为上面已经约束过了所以这里不用在对eureka版本进行管理-->
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
</project>
4.创捷启动器
//spring boot启动项注解是1.SpringBootConfiguration2.EnableAutoConfiguration3.ComponentScan()
//这三个注解的组合注解就是去开自动自动配置相关文件,自动扫描
@SpringBootApplication
//通过一个marker bean来激活eureka的相关配置
//也可以说加上这个注解就表示这个项目是一个eureka注册中心了
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class);
}
}
5.相关配置
# 本项目的端口号
server:
port: 10086
# 服务名称
spring:
application:
name: eurekaServer
# 注册中心地址
eureka:
client:
service-url:
defaultZone: http://localhost:10086/eureka
server:
# 自动保护就是保护项目的在eureka中的存在,当心跳没有了我们就认定这个项目挂了。但是有可能是应为网络问题导致的心跳不能及时。
# 所以就开启保护模式,但是在练习的时候也就在一台电脑上所以关闭
enable-self-preservation: false # 关闭自我保护模式(缺省为打开)
eviction-interval-timer-in-ms: 1000 # 扫描失效服务的间隔时间(缺省为60*1000ms)
这样启动就已经完成eureka的搭建了。启动访问http://localhost:10086/就可以看见eureka中注册的项目。
项目提供者
1.在项目提供者添加相关依赖
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>cn.yh</groupId>
<artifactId>service-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>service-provider</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<!-- SpringCloud的依赖 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- Eureka客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<!-- 需要手动引入通用mapper的启动器,spring没有收录该依赖 -->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.0.4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.配置文件
server:
port: 8082
# 改成自己本机的相关配置
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql:///test?useSSL=false
username: root
password: root
application:
name: service-provider # 服务名称
# 实体类文件夹
mybatis:
type-aliases-package: cn.cong.pojo
# 注册中心地址
eureka:
client:
service-url:
defaultZone: http://localhost:10086/eureka
register-with-eureka: true
3.添加启动器
package cn.cong;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import tk.mybatis.spring.annotation.MapperScan;
/*
* @Author: cong
* @Date: 2022/8/15 16:16
* @Desc:
* */
@SpringBootApplication
//表示mapper的文件位置就不用每个都打上mapper注解了
@MapperScan("cn.cong.mapper")
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class);
}
}
4.自己实现想实现的功能
项目调用者
和项目的提供者依赖一样
1.启动项
@SpringBootApplication
//服务的注册与发现
@EnableDiscoveryClient
public class ConsumerApplicaton {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplicaton.class);
}
//通过RestTemplate去调用远程的服务
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
2.配置文件
server:
port: 80
spring:
application:
name: service-consumer
eureka:
client:
service-url:
defaultZone: http://localhost:10086/eureka
3.调用服务提供的功能
@RestController
@RequestMapping("/user")
public class UserController {
//eureka特有的
@Autowired
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("/queryUserById/{id}")
public User selectUserbyId(@PathVariable("id") Integer id){
//获取链接
/*List<ServiceInstance> instances = discoveryClient.getInstances("service-provider");
String uri = instances.stream().map(instance -> instance.getUri().toString() + "/user/queryUserById/"+id)
.findFirst()
.orElseThrow(() -> new RuntimeException("sadasdas"));
System.out.println(uri);*/
//通过service-provider也就是服务名拼接调用
return restTemplate.getForObject("http://service-provider/user/queryUserById/" + id, User.class);
// return restTemplate.getForObject("http://desktop-odko2nl:8082/user/queryUserById/41", User.class);
// return restTemplate.getForObject(uri,User.class);
}
}