day02-项目搭建+consul

1 RestTemplate

RestTemplate提供了多种便捷访问远程Http服务的方法,

是一种简单便捷的访问restful服务模板类,是Spring提供的用于访问Rest服务的客户端模板工具集

官网地址:https://docs.spring.io/spring-framework/docs/6.0.11/javadoc-api/org/springframework/web/client/RestTemplate.html

常用接口:

  • getForObject:返回对象为响应体中数据转化成的对象,基本上可以理解为Json

  • getForEntity:返回对象为ResponseEntity对象,包含了响应中的一些重要信息,比如响应头、响应状态码、响应体等

  • postForObject

  • postForEntity

GET请求方法:

<T> T getForObject(String url, Class responseType, Object... uriVariables);

<T> T getForObject(String url, Class responseType, Map<String, ?> uriVariables);

<T> T getForObject(URI url, Class responseType);

<T> ResponseEntity getForEntity(String url, Class responseType, Object... uriVariables);

<T> ResponseEntity getForEntity(String url, Class responseType, Map<String, ?> uriVariables);

<T> ResponseEntity getForEntity(URI var1, Class responseType);

POST请求方法:

<T> T postForObject(String url, @Nullable Object request, Class responseType, Object... uriVariables);

<T> T postForObject(String url, @Nullable Object request, Class responseType, Map<String, ?> uriVariables);

<T> T postForObject(URI url, @Nullable Object request, Class responseType);

<T> ResponseEntity postForEntity(String url, @Nullable Object request, Class responseType, Object... uriVariables);

<T> ResponseEntity postForEntity(String url, @Nullable Object request, Class responseType, Map<String, ?> uriVariables);

<T> ResponseEntity postForEntity(URI url, @Nullable Object request, Class responseType);

通过容器注入编写配置类:

@Configuration
public class RestTemplateConfig
{
    @Bean
    public RestTemplate restTemplate()
    {
        return new RestTemplate();
    }
}

2 Idea中调整Java语法版本

project structure -> modules -> sources -> language level

3 Consul

  1. 为什么要使用consul

    微服务所在的IP地址和端口号硬编码存在非常多的问题:IP和端口变化、无法实现负载均衡、维护复杂

    应该怎么做:服务名固定,路径不固定

  2. 什么是Consul

    开源的分布式服务发现与配置管理系统,由HashiCorp公司用Go语言开发

  3. consul安装、下载和运行

    • 下载:http://consul.io -> downloads -> 选择相应的版本
    • 安装:解压即可
    • 运行:在根路径下输入命令consul agent -dev
    • 验证:访问http://localhost:8500
  4. 注册

    1. 启动consul

    2. 添加依赖如下

      <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>
      
    3. 修改配置

      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进行注册
      
    4. 在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分布式配置

  1. 添加依赖

    		<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>
    
  2. 新增配置 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中删去

  3. Consul添加配置

    1. Kay/Value 下创建文件夹config(创建时以/结尾识别为文件夹),然后建立三个子文件夹**-prod、**-dev、**分别表示发布环境、开发环境、默认环境,**表示服务名
    2. 接着在各个子文件夹中添加data配置文件 配置相关信息
posted @ 2024-07-07 12:18  yuqiu2004  阅读(13)  评论(0编辑  收藏  举报