day02-项目搭建+consul
1 RestTemplate
RestTemplate提供了多种便捷访问远程Http服务的方法,
是一种简单便捷的访问restful服务模板类,是Spring提供的用于访问Rest服务的客户端模板工具集
常用接口:
-
getForObject:返回对象为响应体中数据转化成的对象,基本上可以理解为Json
-
getForEntity:返回对象为ResponseEntity对象,包含了响应中的一些重要信息,比如响应头、响应状态码、响应体等
-
postForObject
-
postForEntity
GET请求方法:
<T> T getForObject(String url, Class
<T> T getForObject(String url, Class
<T> T getForObject(URI url, Class
<T> ResponseEntity
<T> ResponseEntity
<T> ResponseEntity
POST请求方法:
<T> T postForObject(String url, @Nullable Object request, Class
<T> T postForObject(String url, @Nullable Object request, Class
<T> T postForObject(URI url, @Nullable Object request, Class
<T> ResponseEntity
<T> ResponseEntity
<T> ResponseEntity
通过容器注入编写配置类:
@Configuration
public class RestTemplateConfig
{
@Bean
public RestTemplate restTemplate()
{
return new RestTemplate();
}
}
2 Idea中调整Java语法版本
project structure -> modules -> sources -> language level
3 Consul
-
为什么要使用consul
微服务所在的IP地址和端口号硬编码存在非常多的问题:IP和端口变化、无法实现负载均衡、维护复杂
应该怎么做:服务名固定,路径不固定
-
什么是Consul
开源的分布式服务发现与配置管理系统,由HashiCorp公司用Go语言开发
-
consul安装、下载和运行
- 下载:http://consul.io -> downloads -> 选择相应的版本
- 安装:解压即可
- 运行:在根路径下输入命令
consul agent -dev
- 验证:访问http://localhost:8500
-
注册
-
启动consul
-
添加依赖如下
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId>//用于排除冲突提示 </exclusion> </exclusions> </dependency>
-
修改配置
spring: application: name: cloud-consumer-order ####Spring Cloud Consul for Service Discovery cloud: consul: host: localhost port: 8500 discovery: service-name: ${spring.application.name} prefer-ip-address: true #优先使用服务ip进行注册
-
在RestTemplateConfig的方法上添加负载均衡的注解
@Configuration public class RestTemplateConfig { @Bean @LoadBalanced // 开启负载均衡 public RestTemplate restTemplate() { return new RestTemplate(); } }
-
4 三个注册中心的异同点
前置概念 | 评判标准:CAP,即Consistency强一致性、Availability可用性、Partition tolerance分区容错性
-
AP架构(Eureka)
-
当网络分区出现后,为了保证可用性,系统B可以返回旧值,保证系统的可用性。
-
当数据出现不一致时,虽然A, B上的注册信息不完全相同,但每个Eureka节点依然能够正常对外提供服务,这会出现查询服务信息时如果请求A查不到,但请求B就能查到。如此保证了可用性但牺牲了一致性结论:违背了一致性C的要求,只满足可用性和分区容错,即AP
-
-
CP架构(Zookeeper/Consul)
- 当网络分区出现后,为了保证一致性,就必须拒接请求,否则无法保证一致性,Consul 遵循CAP原理中的CP原则,保证了强一致性和分区容错性,且使用的是Raft算法,比zookeeper使用的Paxos算法更加简单。虽然保证了强一致性,但是可用性就相应下降了,例如服务注册的时间会稍长一些,因为 Consul 的 raft 协议要求必须过半数的节点都写入成功才认为注册成功 ;在leader挂掉了之后,重新选举出leader之前会导致Consul 服务不可用。结论:违背了可用性A的要求,只满足一致性和分区容错,即CP
Eureka只能进行服务注册,而Consul不仅可以注册还可以分布式配置
5 consul分布式配置
-
添加依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-config</artifactId> <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> </dependency>
-
新增配置 bootstrap.yml
-
区别:
- application.yml 用户级的资源配置项
- bootstrap.yml 系统级的 优先级更高
-
spring: application: name: cloud-payment-service ####Spring Cloud Consul for Service Discovery cloud: consul: host: localhost port: 8500 discovery: service-name: ${spring.application.name} config: profile-separator: '-' # default value is ',' format: yaml
-
将相关内容从application.yml中删去
-
-
Consul添加配置
- Kay/Value 下创建文件夹config(创建时以/结尾识别为文件夹),然后建立三个子文件夹**-prod、**-dev、**分别表示发布环境、开发环境、默认环境,**表示服务名
- 接着在各个子文件夹中添加data配置文件 配置相关信息