目录
一、背景
1、概念
2、CAP 理论
3、常见的注册中心
二、Eureka
三、搭建 Eureka Server
1、搭建注册中心
四、服务注册
五、服务发现
六、Eureka 和 Zooper 的区别
一、背景
1、概念
远程调用就类似于一种通信
例如:当游客与景区之间进行通信(电话的方式),此时游客需要得到景区的电话,例如通过景区官网或者 114 查号台进行查询
那么 114 平台又是如何知道景区和电话的关系的呢?
景区当创建和修改的时候告诉 114 平台,由 114 平台对信息进行维护,游客就可以通过 114 查询电话,再向景区进行通讯
上述的解决方案同样也适用于微服务中
在微服务中,有两个角色:服务消费者和服务提供者
当订单服务调用商品服务,从中获取到对应的商品信息,此时订单服务就是服务消费者,商品服务就是服务提供者
服务提供者在启动之初,向平台进行注册,告诉平台 应用 和 IP 的关系,服务消费者可以从平台中根据应用获取到 IP 地址,然后根据 IP 地址进行远程调用
服务提供者和注册中心的关系我们称之为服务注册,服务消费者和注册中心的关系称为服务发现
我们来看一下这三种角色分别的作用:
注意:服务提供者和服务消费者是相对的概念!!!
服务注册和服务发现的解释:
2、CAP 理论
CAP 理论是分布式系统中最基础、最关键的理论
我们来看一下 CAP 理论的图:
C:Consistency 一致性(此处的一致性指的是强一致性)
A:Availability 可用性 (对所有请求都有响应,这个响应可能是错误的数据)
P:Partition tolerance 分区容错性(在网络分区的情况下,我们的系统依然可以对外提供服务)
例如:银行利率下调,这个通知需要下发到各个银行的工作人员,通知下发需要一定的时间
一致性:在相同的时间点,所有的工作人员对客户讲的利率都是一样的
可用性:不论何时,所有的银行工作人员对客户咨询利率都是有回复的(回复也有可能是旧利率)
分区容错性:如果其中一个工作人员请假了,银行仍然可以对外提供服务
在分布式系统中,P 必须要保证,所以 C 和 A 只能二选一,因此我们的架构就是 AP / CP 架构
CP架构: 为了保证分布式系统对外的数据⼀致性, 于是选择不返回任何数据
AP架构: 为了保证分布式系统的可⽤性, 节点2返回V0版本的数据(即使这个数据不正确)
什么是强一致性?
数据库集群分为主库和从库
客户端向数据库集群发送了一个数据修改的请求,数据库集群需要向客户端进行响应,响应的时机分为以下两种:
1、主库接收到请求,并处理成功,此时数据还未完全同步到从库,随着时间的推移,主库和从库的数据最终达到一致性
2、主库接收到请求,并且所有从库数据同步成功时,数据库集群才进行响应
强一致性:主库和从库,无论何时对外提供的服务都是一致的【第二种情况】
弱一致性:随着时间的推移,最终达到了一致性【第一种情况】
3、常见的注册中心
二、Eureka
等),Eureka Server 会存储这些信息
三、搭建 Eureka Server
1、搭建注册中心
(1)创建项目
(2)pom 中加入 Eureka 的依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
(3)配置文件增加 Eureka 相关配置
# Eureka相关配置
# Eureka 服务
server:port: 10010
spring:application:name: eureka-server
eureka:instance:hostname: localhostclient:fetch-registry: false # 表示是否从Eureka Server获取注册信息,默认为true.因为这是一个单点的Eureka Server,不需要同步其他的Eureka Server节点的数据,这里设置为falseregister-with-eureka: false # 表示是否将自己注册到Eureka Server,默认为true.由于当前应用就是Eureka Server,故而设置为false.service-url:# 设置与Eureka Server的地址,查询服务和注册服务都需要依赖这个地址defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
(4)启动类,开启 Eureka 功能
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {public static void main(String[] args) {SpringApplication.run(EurekaServerApplication.class,args);}
}
四、服务注册
服务注册分为以下几步:
1、加入 Eureka 的依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>
2、修改配置信息
#Eureka Client
eureka:client:service-url:defaultZone: http://127.0.0.1:10010/eureka/
spring:application:name: product-service # 自定义名字
3、启动,测试
五、服务发现
服务发现分为以下几步:
1、加入 Eureka 依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>
2、修改配置信息
配置信息与上面的一样
3、修改远程调用代码
@Service
public class OrderService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate RestTemplate restTemplate;@Autowiredprivate DiscoveryClient discoveryClient;public OrderInfo selectOrderById(Integer orderId){OrderInfo orderInfo = orderMapper.selectOrderById(orderId);// String url = "http://127.0.0.1:9090/product/"+orderInfo.getProductId();List<ServiceInstance> instances = discoveryClient.getInstances("product-service");String uri = instances.get(0).getUri().toString();String url = uri + "/product/"+orderInfo.getProductId();ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);orderInfo.setProductInfo(productInfo);return orderInfo;}
}
4、启动,测试