新建项目
模块间调用,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;
@Configuration
@Slf4j
public class ApplicationContextConfig {
@Bean
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
@RestController
@Slf4j
public class OrderController {
public static final String PAYMENT_URL = "http://localhost:8001";
@Resource
private 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);
}
}
一、服务注册与发现
- 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秒)
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
@EnableEurekaServer
public class EurekaMain {
public static void main(String[] args) {
SpringApplication.run(EurekaMain.class,args);
}
}
server:
port: 7001
eureka:
instance:
hostname: 127.0.0.1
client:
# false表示不向注册中心注册自己
register-with-eureka: false
# false表示自己端就是注册中心,不需要取检索服务
fetch-registry: false
service-url:
# 设置与Eureka Server 交互的地址,查询服务和注册服务都需要依赖这个地址
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
eureka:
client:
# 表示将自己注册进Eureka Server
register-with-eureka: true
# 是否从EurekaServer抓取已有的注册信息,集群必须为true才能配合ribbon使用
fetch-registry: true
service-url:
defaultZone: http://localhost:7001/eureka
# 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: 7001
eureka:
instance:
hostname: eureka7001.com
client:
# 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: 8001
eureka:
client:
# 表示将自己注册进Eureka Server
register-with-eureka: true
# 是否从EurekaServer抓取已有的注册信息,集群必须为true才能配合ribbon使用
fetch-registry: true
service-url:
# 同时注册进7001,7002
defaultZone: http://eureka7001.com:7001/eureka , http://eureka7002.com:7002/eureka
- 主机名称:服务名称修改
- 访问信息有ip信息提示
-
服务发现,@EnableDiscoveryClient
自我保护机制:默认情况下 Eurekaclient走时向 Eurekaserver端发送心跳包,如果 Eureka在 servel端在一定时间内(默认90秒)股有收到 Eurekaclient发送心跳包,便会直接从服务注册列表中剔除该服务,但是在短时间(90秒中)内丢失了大量的服务实例心跳,这时候 Eurekaserver会开启自我保护机制,不会剔除该服务(该现象可能出现在如果网络不通,但是 EurekaClient为出现宕机,此时如果换做别的注册中心如果一定时间内没有收到心跳会将剔除该服务,这样就出现了严重失误,因为喜户端还能正常发送心跳,只是网络延迟问题,而保护机制是为了解决此问题而产生的)
server:
port: 7001
eureka:
instance:
hostname: eureka7001.com
client:
# 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
-
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: 8004
spring:
application:
name: hzl-payment-service
cloud:
# zookeeper
zookeeper:
connect-string: 111.55.34.111:2181
@SpringBootApplication
@EnableDiscoveryClient
public class Payment4Main {
public static void main(String[] args) {
SpringApplication.run(Payment4Main.class,args);
}
}
- 注意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>
Consu是一套开源的分布式服务发现和配置管理系统,由 HashiCorp公司用Go语言开发。提供了微服务系统中的服务治理、配置中心、控制总线等功能。这些功能中的每一个都可以根据需要单独使用,也可以-起使用以构建全方位的服务网格,总之 Consul提供了一种完整的服务网格解决方案。
Consul下载文档 Consul中文文档
win10启动: consul agent -dev
consul访问地址:http://localhost:8500/
<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: 8006
spring:
application:
name: hzl-payment-service
# consul注册中心地址
cloud:
consul:
host: 127.0.0.1
port: 8500
discovery:
service-name: ${spring.application.name}
Eureka、Zookeeper和Consul三者区别
-
CAP原则又称CAP定理,指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。 -
CAP理论关注粒度是数据,而不是整体系统设计的策略
|