spring cloud 入门笔记1(RestTemplate,Consul)

最大感受:

spring cloud无非是将spring boot中的各个工作模块拆分成独立的小spring boot,各个模块之间,不再是通过导包什么的,调用而是通过网路进行各个模块之间的调用

工具一:RestTemplate

在Java代码中发送HTTP请求,可配合spring mvc实现类似于前端的请求转发一样的效果

步骤一:导入依赖

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-web</artifactId>

<version>5.2.6.RELEASE</version>

</dependency>

步骤二:编写配置类

config/RestTemplateConfig

@Configuration
public class RestTemplateConfig {
    @Bean
    @LoadBalanced//实现负载均衡
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

 步骤三:发送HTTP请求

@RestController
@Slf4j
public class OrderController {
    public static final String PaymentSrv_URL="http://localhost:8001";

    @Resource
    private RestTemplate restTemplate;

    @GetMapping("/consumer/pay/add")
    public ResultData addOrder(PayDTO payDTO){
        System.out.println(payDTO);
        return restTemplate.postForObject(PaymentSrv_URL + "/pay/add",payDTO,ResultData.class);
    }

从“/consumer/pay/add”接收到的数据,再通过restTemplate中的方法发送别的请求

技术栈一: Consul

场景:

微服务所在的IP地址和端口号硬编码到订单微服务中,会存在非常多的问题
(1)如果订单微服务和支付微服务的IP地址或者端口号发生了变化,则支付微服务将变得不可用,需要同步修改订单微服务中调用支付微服务的IP地址和端口号。
(2)如果系统中提供了多个订单微服务和支付微服务,则无法实现微服务的负载均衡功能。
(3)如果系统需要支持更高的并发,需要部署更多的订单微服务和支付微服务,硬编码订单微服务则后续的维护会变得异常复杂。
所以,在微服务开发的过程中,需要引入服务治理功能,实现微服务之间的动态注册与发现。

步骤一:导入依赖

<!--SpringCloud consul config-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-consul-config</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>


<!--SpringCloud consul discovery -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>

 步骤二:编写配置文件

基础知识:

一个项目中通常存在application.yml文件用于项目的参数配置,

但同时还存在bootstrap.yml文件也可以进行参数配置

bootstrap.yml通常用于配置全局的通用的参数,优先级较高

application.yml通常用于配置局部的参数,优先级较低

可共存

plication.yml

server:
  port: 8001

# ==========applicationName + druid-mysql8 driver===================
spring:
  profiles:
    //选择要从consul中读取的文件
    active: dev # 多环境配置加载内容dev/prod,不写就是默认default配置

# ========================mybatis===================
mybatis:
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: com.atguigu.cloud.entities
  configuration:
    map-underscore-to-camel-case: true
数据永久化:consul数据持久化_consul配置持久化-优快云博客

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 ",",we update '-'
        format: YAML

  # config/cloud-payment-service/data
  #       /cloud-payment-service-dev/data
  #       /cloud-payment-service-prod/data

通过这两个配置文件,可以将这一个子项目,注册到consul中

即原本可以通过localhost/8001访问的项目,取了个别名cloud-payment-service

后可通过别名访问该项目

 步骤三:启动服务

cmd命令行: consul agent -dev

http://localhost:8500/中进行配置

步骤四:调用服务

//从application.yml中获取的参数
@Value("${server.port}")
private String port;
@GetMapping("/pay/get/info")
//从bootstrap.yml中获取consul中的对应文件中的参数
public String getInfoByConsul( @Value("${atguigu.info}") String atguiguInfo )
{
    return "atguiguInfo:"+atguiguInfo+"\t"+"port:"+port;
}

以上总结:

我们将原本配置在项目内的参数配置到了consul注册中心中,

使我们在不同模块中的各个子模块中的参数和模块之间解耦,可以统一配置,

这么麻烦,就是为了实现负载均衡

技术栈二:loadbalancer

步骤一:导入依赖


<!--loadbalancer-->
< dependency >
     < groupId >org.springframework.cloud </ groupId >
     < artifactId >spring-cloud-starter-loadbalancer </ artifactId >
</ dependency >

 步骤二:你不干有的是人干

仔细看会发现cloud-payment-service下是2,

这表明有两个项目(8001,8002 ....端口号不同)在配置时,都以cloud-payment-service为名,注册到consul中

即cloud-payment-service服务有2个端口提供服务

注:loadbalancer默认为轮询算法,即轮流提供服务

所以:

@RestController
public class OrderController
{
    //public static final String PaymentSrv_URL = "http://localhost:8001";//先写死,硬编码

    
public static final String PaymentSrv_URL "http://cloud-payment-service";//服务注册中心上的微服务名称

    
@Autowired
    
private RestTemplate restTemplate;


    @GetMapping(value = "/consumer/pay/get/info")
    private String getInfoByConsul()
    {
        return restTemplate.getForObject(PaymentSrv_URL "/pay/get/info", String.class);
    }

//当有人发送http://cloud-payment-service请求时,会自动映射为提供服务的端口号

从而实现http://cloud-payment-service服务时,会由不同的项目提供服务,减小服务器压力,即负载均衡
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值