2-1.SpringCloud前期基础(微服务概念、服务调用方式、Http客户端工具、RestTemplate)

最近突发奇想,整合一下以前一些学习笔记,分享自己这几年爬过的坑,逐步更新文章,谢谢大家的关注和支持。

微服务

微服务的具体概念 大家可以上百度百科看一下,这里就不再多说,提一下微服务两个很重要的特性

  1. 有自己的堆栈,包括数据库和数据模型;
  2. 对外暴露Rest风格的接口
    微服务并不关系技术实现,因此和语言无关,只要提供Rest接口即可。

服务调用方式

  1. RPC,RemoteProduce Call 远程过程调用,基于原生TCP通信。热门的就是阿里的dubbo
  2. Http,其实是基于TCP的一种网络传输协议,也可以用来进行远程服务调用。现在热门的Rest风格可以通过http协议来完成。缺点是消息封装臃肿(请求体、请求头等等),优势就是对服务的提供和调用没有技术限定,自由灵活,更符合微服务理念。

Http客户端工具

包括HttpClient、OKHttp、Jdk原生的HttpUrlConnection,因为这三种使用方式都不同,因此学了一个另一个又不会,因此我觉得没必要直接用Spring提供的RestTemplate即可,其支持这三个工具,默认是HttpUrlConnection

RestTemplate

前面第一章节讲到了springboot的知识,里面的项目就用作提供服务,具体可以看我前面的的博客1-6. SpringBoot整合JDBC线程池,整合Mybatis(相关事务控制、通用Mapper)快速实现旧式SSM架构

添加了controller层代码来提供rest api
controller层代码如下:

package cn.sysu.ming.controller;

import cn.sysu.ming.pojo.Product;
import cn.sysu.ming.service.ProductService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@RestController
public class TestController {

    @Autowired
    private ProductService productService;

    @RequestMapping("hello")
    public String test() {

        log.info("#日志# ======= 测试拦截器---log");
        return "Hello, ming";
    }

    @RequestMapping("product/{id}")
    public Product product(@PathVariable("id") int id) {
        log.info("#日志# ======= 根据id查找product,id为:" + id);
        return productService.findById(id);
    }
}

测试一下,没问题
在这里插入图片描述

项目源码在已经放在Github上,ming-base是服务提供者,ming-http是服务调用者
https://github.com/mingweihua/ming

有了服务提供者,接下来新建一个springboot项目,来作为服务调用者,就是ming-http
功能很少,因此pom就添加以下依赖即可

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

最重要的web的依赖,其他可有可无。

application.yml更简单,只要跟ming-base端口不一样即可

server:
  port: 8083

首先先把RestTemplate放进去ioc容器中(当然不放也行,通过new出来也没问题)。定义一个配置类

package cn.sysu.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class RestTemplateConfig {


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

定义一个你查找数据的pojo类,这里用到lombok,不会的朋友们可以看我发过的一篇文章1-5. SpringBoot—java后端开发人员的神器lombok

package cn.sysu.pojo;

import lombok.Data;

@Data
public class Product {

    private Integer id;

    private String name;
    private Integer price;
}

按理接下来是写一个controller类的,不过博主就偷偷懒,写个测试类就算了。

先往测试类注入RestTemplate 。然后通过其中一个getForObject方法来调用另一个服务(即ming-base),需要两个参数一个是url地址,一个是你查找的数据类型的class文件


@SpringBootTest
class MingHttpApplicationTests {

    @Autowired
    private RestTemplate restTemplate;

    @Test
    void contextLoads() {
        Product product = restTemplate.getForObject("http://localhost:8080/product/1",Product.class);
        System.out.println(product);
    }

}

运行测试得到以下,成功了。
在这里插入图片描述

项目源码在已经放在Github上,ming-base是服务提供者,ming-http是服务调用者
https://github.com/mingweihua/ming

但是这种微服务有几个缺点

  1. url地址写死,万一服务提供者地址变了呢,服务调用者却不知道,知道还得修改代码,维护困难
  2. 服务提供者出现问题了,不能运行,那么服务调用者却不知道,还一直请求,这样也出问题了。
  3. 服务提供者只有一一台服务,不具备高可用性,即使形成集群,还需调用者来实现负载均衡。
  4. 等等。。。

因此才有SpringCloud的出现,后面再发博客!

博主的坚持 离不开大家关注、评论和点赞,感谢大家支持。护发路上互相扶持!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值