您的位置:首页 > 汽车 > 新车 > 郑州富士康怎么样_企业展馆展厅设计公司_互联网营销师培训大纲_百度一下你就知道了百度

郑州富士康怎么样_企业展馆展厅设计公司_互联网营销师培训大纲_百度一下你就知道了百度

2025/4/3 12:21:56 来源:https://blog.csdn.net/LHY537200/article/details/146774033  浏览:    关键词:郑州富士康怎么样_企业展馆展厅设计公司_互联网营销师培训大纲_百度一下你就知道了百度
郑州富士康怎么样_企业展馆展厅设计公司_互联网营销师培训大纲_百度一下你就知道了百度

一.使用注册中心背景 

1.1服务远程调用问题

服务之间远程调⽤时, 我们的URL是写死的 

String url = "http://127.0.0.1:9090/product/"+ orderInfo.getProductId();

缺点:

当更换机器, 或者新增机器时, 这个URL就需要跟着变更, 就需要去通知所有的相关服务去修改. 随之⽽来的就是各个项⽬的配置⽂件反复更新, 各个项⽬的频繁部署. 这种没有具体意义, 但⼜不得不做的⼯作, 会让⼈非常痛苦

解决方法:

这样就类似解决高耦合的思想,引入第三方来保存保存和交互双方信息

我们⽣活中, 避免不了和各个机构(医院, 学校, 政府部⻔等)打交道, 就需要保存各个机构的电话号码. 如果机构换了电话号码, 就需要通知各个使⽤⽅, 但是这些机构的使⽤⽅群体是巨⼤的, 没办法做到⼀⼀通知, 怎么处理呢?
机构电话如果发⽣变化, 通知114. ⽤⼾需要联系机构时, 先打114查询电话, 然后再联系各个机构.

114查号台的作⽤主要有两个:
  • 号码注册: 服务方把电话上报给114
  • 号码查询: 使用方通过114可以查到对应的号码

 

同样的, 微服务开发时, 也可以采⽤类似的⽅案.
  • 服务启动/变更时, 向注册中心报道. 注册中心记录应用和IP的关系.
  • 调⽤⽅调⽤时, 先去注册中心获取服务⽅的IP, 再去服务⽅进⾏调⽤

 1.2什么是注册中心

在最初的架构体系中, 集群的概念还不那么流⾏, 且机器数量也⽐较少, 此时直接使⽤DNS+Nginx就可以满⾜⼏乎所有服务的发现. 相关的注册信息直接配置在Nginx. 但是随着微服务的流⾏与流量的激增,机器规模逐渐变⼤, 并且机器会有频繁的上下线⾏为, 这种时候需要运维⼿动地去维护这个配置信息是⼀个很⿇烦的操作. 所以开发者们开始希望有这么一个东西, 它能维护⼀个服务列表, 哪个机器上线了,哪个机器宕机了, 这些信息都会自动更新到服务列表上, 客户端拿到这个列表, 直接进行服务调用即可. 这个就是注册中心。

 注册中⼼主要有三种⻆⾊:

  • 服务提供者(Server):⼀次业务中, 被其它微服务调用的服务. 也就是提供接⼝给其它微服务.
  • 服务消费者(Client):⼀次业务中, 调用其它微服务的服务. 也就是调⽤其它微服务提供的接⼝.
  • 服务注册中⼼(Registry): ⽤于保存Server 的注册信息, 当Server 节点发⽣变更时, Registry 会同步变更. 服务与注册中⼼使⽤⼀定机制通信, 如果注册中⼼与某服务⻓时间⽆法通信, 就会注销该实例

1.3CAP理论

CAP 理论是分布式系统设计中最基础, 也是最为关键的理论.  

  • ⼀致性(Consistency) CAP理论中的⼀致性, 指的是强⼀致性. 所有节点在同⼀时间具有相同的数据
  • 可⽤性(Availability) 保证每个请求都有响应(响应结果可能不对)
  • 分区容错性(Partition Tolerance) 当出现⽹络分区后,系统仍然能够对外提供服务
⼀个部门全国各地都有岗位, 这时候, 总部下发了⼀个通知, 由于通知需要开会周知全员, 当有客户咨询时:
所有成员对客户的回应结果都是⼀致的(⼀致性)
客户咨询时, ⼀定有回应(可用性)
当其中⼀个成员休假时, 这个部门的其他成员也可以对客户提供咨询服务(分区容错性)
CAP 理论告诉我们: ⼀个分布式系统不可能同时满⾜数据⼀致性, 服务可⽤性和分区容错性这三个基本需求, 最多只能同时满⾜其中的两个
为什么?
  • 如果要保证一致性,总部有了新通知,就必须等所有地区的成员都收到通知后,才能统一回应客户。但这样在网络故障期间,那些没收到通知的地区成员就无法回应客户,也就牺牲了可用性。
     
  • 如果要保证可用性,不管网络有没有问题,只要客户来咨询,成员们就得马上回应。但这样一来,在网络分区的情况下,那些没收到新通知的成员可能就会给出和收到通知的成员不一样的回应,也就牺牲了一致性。
在分布式系统中, 系统间的⽹络不能100%保证健康, 服务⼜必须对外保证服务. 因此Partition
Tolerance不可避免. 那就只能在C和A中选择⼀个. 也就是CP或者AP架构
CP架构: 为了保证分布式系统对外的数据⼀致性, 于是选择不返回任何数据
AP架构: 为了保证分布式系统的可⽤性, 即使数据不一致,也要保证响应

1.4常见的注册中心

  1. Zookeeper
    Zookeeper的官⽅并没有说它是⼀个注册中⼼, 但是国内Java体系, ⼤部分的集群环境都是依赖 Zookeeper来完成注册中⼼的功能.
  2. Eureka:
    Eureka是Netflix开发的基于REST的服务发现框架, 主要⽤于服务注册, 管理,负载均衡和服务故障转移. 官⽅声明在Eureka2.0版本停⽌维护, 不建议使⽤. 但是Eureka是SpringCloud服务注册/发现的默认实现, 所以⽬前还是有很多公司在使⽤.
  3. Nacos:
    Nacos是Spring Cloud Alibaba架构中重要的组件, 除了服务注册, 服务发现功能之外, Nacos还⽀持配置管理, 流量管理, DNS, 动态DNS等多种特性

 CAP理论对比 

在分布式环境中, 即使拿到⼀个错误的数据, 也胜过⽆法提供实例信
11.11, 京东618都是谨遵AP原则)

 

二.Eureka介绍

Eureka是Netflix OSS套件中关于服务注册和发现的解决⽅案. Spring Cloud对Eureka进⾏了集成, 并作为优先推荐⽅案进⾏宣传, 虽然⽬前Eureka 2.0已经停⽌维护, 新的微服务架构设计中, 也不再建议使⽤, 但是⽬前依然有⼤量公司的微服务系统使⽤Eureka作为注册中⼼
官⽅⽂档: https://github.com/Netflix/eureka/wiki
Eureka主要分为两个部分:

  • Eureka Server: 作为注册中心Server端, 向微服务应⽤程序提供服务注册, 发现, 健康检查等能力.
  • Eureka Client: 服务提供者, 服务启动时, 会向Eureka Server 注册⾃⼰的信息(IP,端⼝,服务信息 等),Eureka Server 会存储这些信息
关于Eureka的使用, 主要包含以下三个部分:
  1. 搭建Eureka Server
  2. 将order-service, product-service 都注册到Eureka
  3. order-service远程调⽤时, 从Eureka中获取product-service的服务列表, 然后进⾏交互

2.1搭建Eureka Server

 Eureka-server 是⼀个独立的微服务,我也通过子项目形式编写

1.搭建注册中心

2.pom文件添加Eureka依赖

 <dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>

3. 创建配置文件,增加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的功能

 

package eureka;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;@EnableEurekaServer
@SpringBootApplication
public class EurekaServiceApplication {public static void main(String[] args) {SpringApplication.run(EurekaServiceApplication.class,args);}
}

 5.启动项目成功嘿嘿


2.2服务注册 

服务注册:针对提供给order订单服务的product产品服务 

接下来我们把product-service 注册到eureka-server中

1. product的pom文件加入Eureka的依赖 

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>

 
2. application.yml修改配置信息

1.添加该服务的信息

2.添加相关eureka配置信息 


3. 启动,测试


2.3服务发现

服务发现:针对消费produc产品服务的order订单服务

接下来我们修改order-service, 在远程调⽤时, 从eureka-server拉取product-service的服务信息, 实现服务发现

1. 加入Eureka依赖

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>


2.application.yml修改配置信息

1.添加该服务的信息

2.添加相关eureka配置信息 

servic:port: 8080spring:application:name: order-servicedatasource:url: jdbc:mysql://127.0.0.1:3306/cloud_order?characterEncoding=utf8&useSSL=falseusername: rootpassword: weigang527driver-class-name: com.mysql.cj.jdbc.Drivermvc:favicon:enable: falseprofiles:  #多平台配置active: dev
# 设置 Mybatis 的 xml 保存路径
mybatis:mapper-locations: classpath:mapper/*Mapper.xmlconfiguration: # 配置打印 MyBatis 执行的 SQLlog-impl: org.apache.ibatis.logging.stdout.StdOutImplmap-underscore-to-camel-case: true  #自动驼峰转换
eureka:client:service-url:defaultZone: http://127.0.0.1:10010/eureka/

3.service层修改远程调用的代码

package order.service;import lombok.extern.slf4j.Slf4j;
import order.mapper.OrderMapper;
import order.model.OrderInfo;
import order.model.ProductInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;import java.util.List;
@Slf4j
@Service
public class OrderService {@Autowiredprivate OrderMapper orderMapper;//注入这个接口@Autowiredprivate RestTemplate restTemplate;@Autowiredprivate DiscoveryClient discoveryClient;//注意这个有多个同名,使用.cloud.client后缀的public OrderInfo selectOrderById(Integer orderId){OrderInfo orderInfo = orderMapper.selectOrderById(orderId);//String url = "http://127.0.0.1:9090/product/" + orderInfo.getProductId();//从Eureka中获取服务列表(因为可能不止一个服务,所有使用列表,然后再选择列表中的product服务)List<ServiceInstance> instances = discoveryClient.getInstances("product-service");String uri = instances.get(0).getUri().toString();String url = uri+"/product/" + orderInfo.getProductId();log.info("远程调用url:{}",url);ProductInfo productInfo = restTemplate.getForObject(url,ProductInfo.class);orderInfo.setProductInfo(productInfo);return orderInfo;}
}


4. 启动,测试 

5.查看远程调用是否成功

 

2.4Eureka 和Zookeeper区别

Eureka和Zookeeper都是用于服务注册和发现的⼯具,区别如下:
  • Eureka是Netflix开源的项目, 而Zookeeper是Apache开源的项⽬.
  • Eureka 基于AP原则, 保证⾼可用, Zookeeper基于CP原则, 保证数据⼀致性.
  • Eureka 每个节点都是均等的, Zookeeper的节点区分Leader 和Follower 或 Observer, 也正因为这个原因, 如果Zookeeper的Leader发⽣故障时, 需要重新选举, 选举过程集群会有短暂时间的不可⽤

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com