Spring-cloud 主键Eureka
一,引入
书接上文,之前完成了一个订单项目,一个商品项目.但是当你访问一个订单的时候,订单里面就会包括商品的内容,由此我们需要对代码做出一些改变,这里就涉及到了两个子项目的通信问题,这里使用RestTemplate解决
在order-service里面创建一个product实体类,并且在order实体类中添加
private ProduceInfo produceInfo;这时需要用到RestTemplate类,我们先创建一个
RestTemplate实例并交给 Spring 容器管理,这样可以在整个应用中通过依赖注入使用(创建一个配置的包,在里面进行书写)@Configuration public class BeanConfig {@Beanpublic RestTemplate restTemplate(){return new RestTemplate();} }修改order-service里面的service层的代码:
@Slf4j @Service public class OrderService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate RestTemplate restTemplate;public OrderInfo selectOrderById(Integer orderId){OrderInfo orderInfo = orderMapper.selectOrderById(orderId);String url="http://127.0.0.1:9090/product/"+orderInfo.getProductId();ProduceInfo produceInfo = restTemplate.getForObject(url, ProduceInfo.class);orderInfo.setProduceInfo(produceInfo);return orderInfo;} }
二, RestTemplate
是支持HTTP请求的工具.REST(表现层资源状态转移:资源:网络上的数据,例如图片,视频,文本等。表现层:资源的表现形式(例如:文本是txt,图片是jpg,还有一些资源是json,xml等等)状态转移:通过网络访问资源,对资源进行修改(增加,修改删除等等)都会引起状态转移)
RESTful:REST是一种设计风格,RESTful就是满足了REST风格的接口或者程序
RestTemplate是Spring提供的,封装HTTP调用,并强制使用RESTful风格,他会处理HTTP连接或者关闭,只需要使用者提供资源的地址和参数
RESTful缺点:操作繁琐,通常RESTful api根据get,post,delete来区分对资源的操作,但是这是不可见的,只能通过抓包工具.有些浏览器对于get和post请求以外的的支持不是很友好,需要进行额外处理
三, 注册中心

服务的提供者:被其他微服务调用的服务
服务消费者:调用其他微服务的服务
服务注册中心:用于保存service的注册信息,当service节点发生变动时,Registry会同步变更
服务注册:在服务提供者启动的时候,向Registry注册自身服务,并向Registry定期发送心跳回报存活状态;
服务发现:服务消费者从注册中心查询服务提供者的地址,并通过该地址调用服务提供者的接口
CAP理论,分布式最基础,最重要的理论:
-------------------------------------------------------------------------------------------------------------------------
C(Consistency):一致性,指的是强一致性(以数据库进行举例,主库和从库无论何时,数据都保持一致性)弱一致性:随着时间的推移,最终主库和从库保持一致
A(Availablility):可用性,对所有请求都有响应,这个响应可能是错误的数据
P(Partition tolerance):分区容错性,在网络分区的情况下,系统依然可以对外提供服务因为P是一定要保证,所以A和C只能二选一。所以我们的架构为CP架构或者AP架构
常见的注册中心:①zookeeper,②Eureka已经停止维护了。但是是springcloud的默认注册中心,③Nacos阿里巴巴提供的,功能非常强大,除基础功能外还有配置管理,流量管理,动态DNS等多种特性
四, Eureka
搭建Eureka service
① 创建项目
② pom加入eureka的依赖
③配置文件,增加eureka的相关配置
④启动类,开启eureka相关的功能-->使用@EnableEurekaServer

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency>
# 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/
@SpringBootApplication
@EnableEurekaServer //开启服务
public class EurekaServiceApplication {public static void main(String[] args) {SpringApplication.run(EurekaServiceApplication.class,args);}
}
启动启动类:

服务注册
①加入Eureka依赖
②修改配置信息
③启动测试
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>
#Eureka Client
eureka:client:service-url:defaultZone: http://127.0.0.1:10010/eureka/
spring:application:name: product-service
重新启动Eureka-service的启动类

服务发现
① 加入Eureka依赖
②修改配置信息
③修改远程调用代码
④启动测试
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>
#Eureka Client
eureka:client:service-url:defaultZone: http://127.0.0.1:10010/eureka/
spring:application:name: order-service
@Autowiredprivate DiscoveryClient discoveryClient;public OrderInfo selectOrderById(Integer orderId){OrderInfo orderInfo = orderMapper.selectOrderById(orderId);//从Eureka中获取服务列表List<ServiceInstance> instances = discoveryClient.getInstances("product-service");String uri = instances.get(0).getUri().toString();String url=uri+"/product/"+orderInfo.getProductId();ProduceInfo produceInfo = restTemplate.getForObject(url, ProduceInfo.class);orderInfo.setProduceInfo(produceInfo);return orderInfo;}
重新启动Eureka-service的启动类

五,Eureka和zookeeper有什么区别
1. Eureka是Netflix开源的项目,Zookeeper是Apache开源的项目.
2. Eureka基于AP原则,保证高可用, Zookeeper基于CP原则,保证数据⼀致性.
3. Eureka每个节点都是均等的,Zookeeper的节点区分Leader和Follower或Observer,也正因为这个原因,如果Zookeeper的Leader发生故障时,需要重新选举,选举过程集群会有短暂时间的不可用
六,完整代码链接
海豚/SpringCloud - Gitee.com 完整代码
https://gitee.com/ABdolphin/spring-cloud/tree/master/spring-cloud-eureka
