
目录
远程调用就类似于一种通信
例如:当游客与景区之间进行通信(电话的方式),此时游客需要得到景区的电话,例如通过景区官网或者 114 查号台进行查询
那么 114 平台又是如何知道景区和电话的关系的呢?
景区当创建和修改的时候告诉 114 平台,由 114 平台对信息进行维护,游客就可以通过 114 查询电话,再向景区进行通讯
上述的解决方案同样也适用于微服务中
在微服务中,有两个角色:服务消费者和服务提供者
当订单服务调用商品服务,从中获取到对应的商品信息,此时订单服务就是服务消费者,商品服务就是服务提供者
服务提供者在启动之初,向平台进行注册,告诉平台 应用 和 IP 的关系,服务消费者可以从平台中根据应用获取到 IP 地址,然后根据 IP 地址进行远程调用
服务提供者和注册中心的关系我们称之为服务注册,服务消费者和注册中心的关系称为服务发现
我们来看一下这三种角色分别的作用:

注意:服务提供者和服务消费者是相对的概念!!!
服务注册和服务发现的解释:

CAP 理论是分布式系统中最基础、最关键的理论
我们来看一下 CAP 理论的图:

C:Consistency 一致性(此处的一致性指的是强一致性)
A:Availability 可用性 (对所有请求都有响应,这个响应可能是错误的数据)
P:Partition tolerance 分区容错性(在网络分区的情况下,我们的系统依然可以对外提供服务)
例如:银行利率下调,这个通知需要下发到各个银行的工作人员,通知下发需要一定的时间
一致性:在相同的时间点,所有的工作人员对客户讲的利率都是一样的
可用性:不论何时,所有的银行工作人员对客户咨询利率都是有回复的(回复也有可能是旧利率)
分区容错性:如果其中一个工作人员请假了,银行仍然可以对外提供服务
在分布式系统中,P 必须要保证,所以 C 和 A 只能二选一,因此我们的架构就是 AP / CP 架构
CP架构: 为了保证分布式系统对外的数据⼀致性, 于是选择不返回任何数据
AP架构: 为了保证分布式系统的可⽤性, 节点2返回V0版本的数据(即使这个数据不正确)
什么是强一致性?
数据库集群分为主库和从库

客户端向数据库集群发送了一个数据修改的请求,数据库集群需要向客户端进行响应,响应的时机分为以下两种:
1、主库接收到请求,并处理成功,此时数据还未完全同步到从库,随着时间的推移,主库和从库的数据最终达到一致性
2、主库接收到请求,并且所有从库数据同步成功时,数据库集群才进行响应
强一致性:主库和从库,无论何时对外提供的服务都是一致的【第二种情况】
弱一致性:随着时间的推移,最终达到了一致性【第一种情况】

(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: localhost
- client:
- fetch-registry: false # 表示是否从Eureka Server获取注册信息,默认为true.因为这是一个单点的Eureka Server,不需要同步其他的Eureka Server节点的数据,这里设置为false
- register-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 的依赖
-
-
org.springframework.cloud -
spring-cloud-starter-netflix-eureka-client -
2、修改配置信息
- #Eureka Client
- eureka:
- client:
- service-url:
- defaultZone: http://127.0.0.1:10010/eureka/
- spring:
- application:
- name: product-service # 自定义名字
3、启动,测试

服务发现分为以下几步:
1、加入 Eureka 依赖
-
org.springframework.cloud -
spring-cloud-starter-netflix-eureka-client -
2、修改配置信息
配置信息与上面的一样
3、修改远程调用代码
- @Service
- public class OrderService {
- @Autowired
- private OrderMapper orderMapper;
-
- @Autowired
- private RestTemplate restTemplate;
-
- @Autowired
- private DiscoveryClient discoveryClient;
-
- public OrderInfo selectOrderById(Integer orderId){
- OrderInfo orderInfo = orderMapper.selectOrderById(orderId);
- // String url = "http://127.0.0.1:9090/product/"+orderInfo.getProductId();
- List
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、启动,测试
