最近突发奇想,整合一下以前一些学习笔记,分享自己这几年爬过的坑,逐步更新文章,谢谢大家的关注和支持。
微服务
微服务的具体概念 大家可以上百度百科看一下,这里就不再多说,提一下微服务两个很重要的特性
- 有自己的堆栈,包括数据库和数据模型;
- 对外暴露Rest风格的接口
微服务并不关系技术实现,因此和语言无关,只要提供Rest接口即可。
服务调用方式
- RPC,RemoteProduce Call 远程过程调用,基于原生TCP通信。热门的就是阿里的dubbo
- 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
但是这种微服务有几个缺点
- url地址写死,万一服务提供者地址变了呢,服务调用者却不知道,知道还得修改代码,维护困难
- 服务提供者出现问题了,不能运行,那么服务调用者却不知道,还一直请求,这样也出问题了。
- 服务提供者只有一一台服务,不具备高可用性,即使形成集群,还需调用者来实现负载均衡。
- 等等。。。
因此才有SpringCloud的出现,后面再发博客!
博主的坚持 离不开大家关注、评论和点赞,感谢大家支持。护发路上互相扶持!!!