转载@paper
Spring Cloud服务注册-Eureka介绍和部署
1、Spring-Cloud Euraka介绍
Spring-Cloud Euraka是Spring Cloud集合中一个组件,它是对Euraka的集成,用于服务注册和发现。Eureka是Netflix中的一个开源框架。它和 zookeeper、Consul一样,都是用于服务注册管理的,同样,Spring-Cloud 还集成了Zookeeper和Consul。
在项目中使用Spring Cloud Euraka的原因是它可以利用Spring Cloud Netfilix中其他的组件,如zull等,因为Euraka是属于Netfilix的。
2、Euraka介绍
Eureka由多个instance(服务实例)组成,这些服务实例可以分为两种:Eureka Server和Eureka Client。为了便于理解,我们将Eureka client再分为Service Provider和Service Consumer。
Eureka Server 提供服务注册和发现
Service Provider 服务提供方,将自身服务注册到Eureka,从而使服务消费方能够找到
Service Consumer服务消费方,从Eureka获取注册服务列表,从而能够消费服务
3. Eureka与Zookeeper比较
P:Partition tolerance,网络分区容错。类似多机房部署,保证服务稳定性。
A: Availability,可用性。
C:Consistency ,一致性。
CAP定理:CAP三个属性对于分布式系统不同同时做到。如AP/CP/AC。再来看Zookeepr区别:
(1)Zookeeper是CP,分布式协同服务,突出一致性。对ZooKeeper的的每次请求都能得到一致的数据结果,但是无法保证每次访问服务可用性。如请求到来时,zookeer正在做leader选举,此时不能提供服务,即不满足A可用性。
(2)Eureka是AP,高可用与可伸缩的Service发现服务,突出可用性。相对于Zookeeper而言,可能返回数据没有一致性,但是保证能够返回数据,服务是可用的。
4. 项目搭建
在这里插入图片描述
spring_cloud:为总项目(父工程)
eureka-server:注册中心的服务(启动注册中心)
user-consumer:消费者(通过注册中心去访问提供者的API接口)
user-provider:提供者(提供访问接口到注册中心)
spring_cloud(父工程)搭建
pom.xml引入
<!--springboot起步依赖-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.2</version>
</parent>
<!--依赖管理-->
<dependencyManagement>
<dependencies>
<!--springcloud依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2021.0.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
eureka-server(注册中心)搭建
pom.xml引入
<dependencies>
<!--注册中心服务-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
1
2
3
4
5
6
7
application.yml
server:
port: 7001
spring:
application:
name: eureka-server
eureka:
client:
register-with-eureka: false
fetch-registry: false
serviceUrl:
defaultZone: http://localhost:7001/eureka
# server:
# enable-self-preservation: false
# eviction-interval-timer-in-ms: 5000
1
2
3
4
5
6
7
8
9
10
11
12
13
14
启动类配置
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class,args);
}
}
1
2
3
4
5
6
7
user-provider(提供者)搭建
在这里插入图片描述
pom.xml引入
<dependencies>
<!--mybatis-plus包-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.1.1</version>
</dependency>
<!--web起步包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--MySQL驱动包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--测试包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--eureka客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--pojo依赖-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
application.yml配置
server:
port: 18081
spring:
datasource:
password: 123456
username: root
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/springcloud?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
application:
name: user-provider
eureka:
client:
serviceUrl:
defaultZone: http://localhost:7001/eureka
instance:
ip-address: 127.0.0.1
prefer-ip-address: true
#若超过90s,eureka服务器还没收到provider发送的http请求,则认为服务停止运行。若关闭了eureka的自我保护机制,则eurekaServer会将无效的服务移除列表
lease-expiration-duration-in-seconds: 90
#服务正常情况下,每个30s,发送一个http请求给eurekaServer,证明自己可以正常运行
lease-renewal-interval-in-seconds: 30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
启动类配置
@SpringBootApplication
@EnableEurekaClient
@MapperScan(basePackages = "com.guigu.dao")
public class UserProviderApplication {
public static void main(String[] args) {
SpringApplication.run(UserProviderApplication.class,args);
}
}
1
2
3
4
5
6
7
8
user-consumer(消费者)搭建
在这里插入图片描述
pom.xml引入
<dependencies>
<!--springWeb依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--eureka客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
1
2
3
4
5
6
7
8
9
10
11
12
application.yml配置
server:
port: 18082
spring:
application:
name: user-consumer
eureka:
client:
serviceUrl:
defaultZone: http://localhost:7001/eureka
1
2
3
4
5
6
7
8
9
启动类配置
@SpringBootApplication
//@EnableDiscoveryClient适用于多种注册中心 @EnableEurekaClient
@EnableDiscoveryClient
public class UserConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(UserConsumerApplication.class,args);
}
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
controller配置
@RestController
@RequestMapping("/consumer")
public class UserController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient;
@RequestMapping("/{id}")
public Object findById(@PathVariable Integer id){
System.out.println("id = " + id);
List<ServiceInstance> serviceInstances = discoveryClient.getInstances("user-provider");
ServiceInstance serviceInstance = serviceInstances.get(0);
String url = "http://"+serviceInstance.getHost()+":"+serviceInstance.getPort()+"/user/find/"+id;
System.out.println(url);
//"http://localhost:18081/user/find/"+id
String result = restTemplate.getForObject(url,String.class);
System.out.println(result);
return result;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
入门搭建项目参考
eurekaspring cloudjava
来自专栏
微服务_Netflix组件
prprprpr. 3篇文章 0人订阅
发布于2022-01-06
著作权归作者所有