一,引入
书接上文,之前完成了一个订单项目,一个商品项目.但是当你访问一个订单的时候,订单里面就会包括商品的内容,由此我们需要对代码做出一些改变,这里就涉及到了两个子项目的通信问题,这里使用RestTemplate解决
在order-service里面创建一个product实体类,并且在order实体类中添加
private ProduceInfo produceInfo;这时需要用到RestTemplate类,我们先创建一个
RestTemplate实例并交给 Spring 容器管理,这样可以在整个应用中通过依赖注入使用(创建一个配置的包,在里面进行书写)
java@Configuration public class BeanConfig { @Bean public RestTemplate restTemplate(){ return new RestTemplate(); } }修改order-service里面的service层的代码:
java@Slf4j @Service public class OrderService { @Autowired private OrderMapper orderMapper; @Autowired private 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

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

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

服务发现
① 加入Eureka依赖
②修改配置信息
③修改远程调用代码
④启动测试
XML
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
XML
#Eureka Client
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10010/eureka/
spring:
application:
name: order-service
java
@Autowired
private 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有什么区别
-
Eureka是Netflix开源的项目,Zookeeper是Apache开源的项目.
-
Eureka基于AP原则,保证高可用, Zookeeper基于CP原则,保证数据⼀致性.
-
Eureka每个节点都是均等的,Zookeeper的节点区分Leader和Follower或Observer,也正因为这个原因,如果Zookeeper的Leader发生故障时,需要重新选举,选举过程集群会有短暂时间的不可用