Spring Cloud服务注册-Eureka介绍和部署
SpringCloud介绍
1、什么是Spring Cloud
Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、智能路由、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有重复制造轮子,它只是将各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
2、分布式和微服务区别
分布式架构是指将单体架构中的各个部分拆分,然后部署不同的机器或进程中去,微服务也是分布式架构的。
微服务是一种更彻底的面向服务的架构,将系统中各个功能个体抽成一个个小的应用程序,基本保持一个应用对应的一个服务的架构
3、Spring Cloud发展前景
Spring Cloud对于中小型互联网公司来说是一种福音,因为这类公司往往没有实力或者没有足够的资金投入去开发自己的分布式系统基础设施,使用Spring Cloud一站式解决方案能在从容应对业务发展的同时大大减少开发成本。同时,随着近几年微服务架构和Docker容器概念的火爆,也会让Spring Cloud在未来越来越“云”化的软件开发风格中立有一席之地,尤其是在五花八门的分布式解决方案中提供了标准化的、全站式的技术方案,意义可能会堪比当年Servlet规范的诞生,有效推进服务端软件系统技术水平的进步。
1 介绍
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获取注册服务列表,从而能够消费服务
1.1 Eureka与Zookeeper比较
首先介绍下cap原理,可以参考:http://www.ruanyifeng.com/blog/2018/07/cap.html。
P:Partition tolerance,网络分区容错。类似多机房部署,保证服务稳定性。
A: Availability,可用性。
C:Consistency ,一致性。
CAP定理:CAP三个属性对于分布式系统不同同时做到。如AP/CP/AC。再来看Zookeepr区别:
(1)Zookeeper是CP,分布式协同服务,突出一致性。对ZooKeeper的的每次请求都能得到一致的数据结果,但是无法保证每次访问服务可用性。如请求到来时,zookeer正在做leader选举,此时不能提供服务,即不满足A可用性。
(2)Euere是AP,高可用与可伸缩的Service发现服务,突出可用性。相对于Zookeeper而言,可能返回数据没有一致性,但是保证能够返回数据,服务是可用的。
2 springcloud整合eureka
一:父项目
目的:使用标签进行版本管理,避免版本冲突。
父项目-cloudlearn
父项目的打包形式必须是pom:pom
:标签进行模块管理
:标签进行版本管理,避免版本冲突
1.8
2.1.5.RELEASE
Greenwich.RELEASE
org.springframework.boot
spring-boot-dependencies
{spring-cloud.version}
pom
import
org.springframework.boot
spring-boot-starter-test
test
org.junit.vintage
junit-vintage-engine
二:Eureka服务注册
cloud-provider-payment7001
pom.xml
打包形式为jar:jar
中依赖不指定版本会直接应用父项目中的jar包版本
导入的是spring-cloud-starter-netflix-eureka-server的jar包
org.springframework.cloud
spring-cloud-starter-netflix-eureka-server
org.springframework.boot
spring-boot-maven-plugin
2.6.4
application.yml
server:
port: 7001
eureka:
instance:
服务注册中心IP地址
hostname: localhost
client:
是否向服务注册中心注册自己
register-with-eureka: false
是否检索服务
fetch-registry: false
service-url:
defaultZone: http://{server.port}/eureka/
springboot入口(启动类)
- 需加上@EnableEurekaServer注解
@SpringBootApplication
@EnableEurekaServer
public class EurekaService7001 {
public static void main(String[] args) {
SpringApplication.run(EurekaService7001.class,args);
}
}
三:服务提供者(Provider)
cloud-provider-payment8001
pom.xml
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-actuator
org.projectlombok
lombok
test
application.yml
#启动端口
server:
port: 8001
项目名称
spring:
application:
name: order-provider
eureka配置
eureka:
instance:
prefer-ip-address: true #使用服务的id地址注册
hostname: localhost
client:
service-url:
defaultZone: http://localhost:7001/eureka/
表示是否将自己注册进EurekaServer 默认为true
register-with-eureka: true
是否从EurekaServer抓取已有的注册信息,默认为true,单接点无所谓,集群必须设置true才能配合ribbon使用负载均衡
fetch-registry: true
springboot入口(启动类)
- 需加上@EnableEurekaServer注解
实现业务类
@RestController
public class PaymentController {
@Value("${server.port}")
private String port;
@GetMapping("/payment/create")
public String getPayment(){
return "提供订单服务:端口" + port;
}
}
四:服务消费者(Consumer)
cloud-consume-order82
pom.xml
dependencies>
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-actuator
org.projectlombok
lombok
test
application.yml
#启动端口
server:
port: 82
项目名称
spring:
application:
name: order-consumer
eureka配置
eureka:
instance:
prefer-ip-address: true #使用服务的id地址注册
hostname: localhost
client:
service-url:
defaultZone: http://localhost:7001/eureka/
springboot入口(启动类)
- 需加上@EnableEurekaServer注解
配置类
- RestTemplate纳入javaBean管理
@Configuration
public class SysConfiguration {
@Bean
@LoadBalanced // 负载均衡
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
远程调用(基于RestTemplate)
- 调用的url为服务提供者在Eureka服务注册中心,注册的application值。
@RestController
public class ConsumerController {@Resource
private RestTemplate restTemplate;/**
- 服务提供的地址:即服务提供方的spring.application.name 转大写
- 也可以理解为在Eureka服务注册中心,注册的application值。
*/
final String urlPath = "http://localhost:8001";
@GetMapping("/consumer/make/order")
public String makeOrder(@RequestParam("name") String name){
String template = restTemplate.getForObject(urlPath + "/payment/create", String.class);
return name + template;
}
}
集群版服务构建
Eureka集群构建7001,7002
相互注册,相互守望
新建7002服务中心,写yml
server:
port: 7002
eureka:
instance:
hostname: localhost
client:
false表示不向注册中心注册自己
register-with-eureka: false
false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要检索服务
fetch-registry: false
service-url:
defaultZone: http://LAPTOP-6PV48BV7:7001/
改7001的yml
server:
port: 7001eureka:
instance:
hostname: LAPTOP-6PV48BV7
client:false表示不向注册中心注册自己
register-with-eureka: false
false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要检索服务
fetch-registry: false
service-url:
defaultZone: http://localhost:7002/
将8001支付注册两微服务注册进Eureka
eureka:
client:表示是否将自己注册进EurekaServer 默认为true
register-with-eureka: true
是否从EurekaServer抓取已有的注册信息,默认为true。单结点无所谓,集群必须设置true
fetch-registry: true
service-url:
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka/eureka
将支付服务8001,8002(复制)多服务注册进Eureka,同上。
消费者80访问Eureka中的支付模块(8001,8002)
其中OrderController中访问地址是写死了,需要变换
@RestController
@Slf4j
@RequiredArgsConstructor
public class OrderController {// public static final String PAYMENT_URL = "http://localhost:8001";
public static final String PAYMENT_URL = "http://CLOUD-PAYMENT-SERVICE";public final RestTemplate restTemplate;
RestTemplate开启访问负载均衡
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced // 使用@LoadBalanced注解赋予RestTemplate负载均衡的能力
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
配置Eureka显示服务名和ip
instance:
instance-id: payment8001
prefer-ip-address: true
[图片上传失败...(image-b9cd0e-1648994950328)]