新建项目
模块间调用,RestTemplate
package com.hzl.springcloud.config;import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;/*** RestTemplate 是从 Spring3.0 开始支持的一个 HTTP 请求工具,它提供了常见的REST请求方案的模版,例如 GET 请求、POST 请求、PUT 请求、DELETE 请求以及* 一些通用的请求执行方法 exchange 以及 execute。RestTemplate 继承自 InterceptingHttpAccessor 并且实现了 RestOperations 接口,* 其中 RestOperations 接口定义了基本的 RESTful 操作,这些操作在 RestTemplate 中都得到了实现。接下来我们就来看看这些操作方法的使用*/
@Configuration
@Slf4j
public class ApplicationContextConfig {
@Beanpublic RestTemplate getRestTemplate(){
return new RestTemplate();}
}
@RestController
@Slf4j
public class OrderController {
public static final String PAYMENT_URL = "http://localhost:8001";@Resourceprivate RestTemplate restTemplate;@GetMapping("/consumer/payment/create")public CommonResult create(Payment payment){
return restTemplate.postForObject(PAYMENT_URL+"/payment/create",payment,CommonResult.class);}@GetMapping(value = "/consumer/payment/get/{id}")public CommonResult getById(@PathVariable("id") Long id){
return restTemplate.getForObject(PAYMENT_URL+"/payment/get/"+id,CommonResult.class);}
}
一、服务注册与发现
-
1、Eureka使用
- Eureka釆用了CS(Client/Server 的设计架构,Eureka Server作为服务注册功能的服务器,它是服务注册中心。而系统中的其他微服,使用 Eureka的客户端连接到Eureka Server并维持心跳连接。这样系统的维护人员就可以通过 Eureka Server来监控系统中各个微服务是否正常运行。
- 在服务注册与发现中,有一个注册中心。当服务器启动的时候,会把当前自己服务器的信息比如服务地址通讯地址等以别名方式注册到注册中心上。另一方(消费者服务提供者),以该别名的方式去注册中心上获取到实际的服务通讯地址,然后再实现本地RPC调用。
- RPC远程调用框架核心设计思想:在于注册中心,因为使用注册中心管理毎个服务与服务之间的一个依赖关系(服务治理概念)。在任何rpc远程框架中,都会有一个注册中心(存放服务地址相关信息接口地址)
Eureka包含两个组件: Eureka Server和 Eureka client- Eureka Server提供服务注册服务:
各个微服务节点通过配置启动后,会在 EurekaServer中进行注册,这样 EurekaServer中的服务注册表中将会存储所有可用服务节点的
信息,服务节点的信息可以在界面中直观看到。- Eureka Client通过注册中心进行访问:
是—个java客户端,用于简化 Eureka server的交互,客户端同时也具备一个内置的、使用轮迿( round- robin)负载算法的负载均衡器
。在应用启动后,将会向 Eureka Server发送心跳(默认周期为30秒)。如果 Eureka server在多个心跳周期内没有接收到某个节点的心
跳, EurekaServery将会从服务注册表中把这个服务节点移除(默认90秒)
/*** @author swl* @create 2021/8/9 20:47*/
@SpringBootApplication(exclude={
DataSourceAutoConfiguration.class})
@EnableEurekaServer
public class EurekaMain {
public static void main(String[] args) {
SpringApplication.run(EurekaMain.class,args);}
}
- 单机eurekaServer
server:port: 7001
eureka:instance:hostname: 127.0.0.1client:# false表示不向注册中心注册自己register-with-eureka: false# false表示自己端就是注册中心,不需要取检索服务fetch-registry: falseservice-url:# 设置与Eureka Server 交互的地址,查询服务和注册服务都需要依赖这个地址defaultZone: http://${
eureka.instance.hostname}:${
server.port}/eureka/
eureka:client:# 表示将自己注册进Eureka Serverregister-with-eureka: true# 是否从EurekaServer抓取已有的注册信息,集群必须为true才能配合ribbon使用fetch-registry: trueservice-url:defaultZone: http://localhost:7001/eureka
-
配置本地hosts
# C:\WINDOWS\system32\drivers\etc
127.0.0.1 eureka7001.com
127.0.0.1 eureka7002.com
127.0.0.1 eureka7003.com
127.0.0.1 myzuul.com
127.0.0.1 config-3344
127.0.0.1 client-config.com
127.0.0.1 cloud-provider-payment
-
EurekaServer集群版,7001与7002相互注册,互相守望
server:port: 7001eureka:instance:hostname: eureka7001.comclient:# false表示不向注册中心注册自己register-with-eureka: false# false表示自己端就是注册中心,不需要取检索服务fetch-registry: false# 设置与Eureka Server 交互的地址,查询服务和注册服务都需要依赖这个地址service-url:# 与7002相互注册defaultZone: http://eureka7002.com:7002/eureka/
-
EurekaClient集群版,同时注册7001,7002
server:port: 8001eureka:client:# 表示将自己注册进Eureka Serverregister-with-eureka: true# 是否从EurekaServer抓取已有的注册信息,集群必须为true才能配合ribbon使用fetch-registry: trueservice-url:# 同时注册进7001,7002defaultZone: http://eureka7001.com:7001/eureka , http://eureka7002.com:7002/eureka
-
仅仅只有服务名称,java无法识别
-
@LoadBalanced
-
8001和8002交替出现
- 主机名称:服务名称修改
- 访问信息有ip信息提示
-
服务发现,@EnableDiscoveryClient
-
Eureka自我保护机制
自我保护机制:默认情况下 Eurekaclient走时向 Eurekaserver端发送心跳包,如果 Eureka在 servel端在一定时间内(默认90秒)股有收到 Eurekaclient发送心跳包,便会直接从服务注册列表中剔除该服务,但是在短时间(90秒中)内丢失了大量的服务实例心跳,这时候 Eurekaserver会开启自我保护机制,不会剔除该服务(该现象可能出现在如果网络不通,但是 EurekaClient为出现宕机,此时如果换做别的注册中心如果一定时间内没有收到心跳会将剔除该服务,这样就出现了严重失误,因为喜户端还能正常发送心跳,只是网络延迟问题,而保护机制是为了解决此问题而产生的)
-
关闭自我保护
server:port: 7001eureka:instance:hostname: eureka7001.comclient:# false表示不向注册中心注册自己register-with-eureka: false# false表示自己端就是注册中心,不需要取检索服务fetch-registry: false# 设置与Eureka Server 交互的地址,查询服务和注册服务都需要依赖这个地址service-url:#与7002相互注册defaultZone: http://eureka7002.com:7002/eureka/server:# 关闭自我保护enable-self-preservation: false# 清理间隔eviction-interval-timer-in-ms: 2000
-
Eureka使用模块
-
2、Zookeeper代替Eureka
- zookeeper是一个分布式协调工具,可以实现注册中心功能
- 关闭Linux服务器防火墙后启动zookeeper
[root@swl123 ~]# systemctl stop firewalld
[root@swl123 ~]# systemctl status firewalld
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-zookeeper-discovery</artifactId></dependency>
# 8004注册进zookeeper
server:port: 8004spring:application:name: hzl-payment-servicecloud:# zookeeperzookeeper:connect-string: 111.55.34.111:2181
@SpringBootApplication
@EnableDiscoveryClient //该注解用于向使用consul或者zookeeper作为注册中心时,注册服务
public class Payment4Main {
public static void main(String[] args) {
SpringApplication.run(Payment4Main.class,args);}
}
-
Zookeeper使用模块
- 注意zk服务器的版本与项目zk的版本,如果报错jar冲突,修改pom文件
<!--SpringBoot整合zookeeper客户端--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-zookeeper-discovery</artifactId><!--排除discovery自带的zookeeper--><exclusions><exclusion><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId></exclusion></exclusions></dependency><!--添加zookeeper版本--><dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.7.0</version></dependency>
-
3、Consul的服务注册与发现
Consu是一套开源的分布式服务发现和配置管理系统,由 HashiCorp公司用Go语言开发。提供了微服务系统中的服务治理、配置中心、控制总线等功能。这些功能中的每一个都可以根据需要单独使用,也可以-起使用以构建全方位的服务网格,总之 Consul提供了一种完整的服务网格解决方案。
Consul下载文档
Consul中文文档
win10启动:
consul agent -dev
consul访问地址:http://localhost:8500/
-
Consul使用模块
<dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-discovery</artifactId><version>3.0.3</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!--热部署--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency></dependencies>
server:port: 8006spring:application:name: hzl-payment-service# consul注册中心地址cloud:consul:host: 127.0.0.1port: 8500discovery:service-name: ${
spring.application.name}
Eureka、Zookeeper和Consul三者区别
CAP原则又称CAP定理,指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。
CAP理论关注粒度是数据,而不是整体系统设计的策略