赞
踩
注:本部分学习资料为某马的SpringCloud文档,虽然小商城只是练手的项目,但是个人觉得学习到的东西远远胜过在很多小公司实习2-3个月所能学习到的也帮助自己拿到了不少offer,感谢!
随着互联网的发展,网站应用的规模不断扩大。需求的激增,带来的是技术上的压力。系统架构也因此也不断的演进、升级、迭代。从单一应用,到垂直拆分,到分布式服务,到SOA,以及现在火热的微服务架构,还有在Google带领下来势汹涌的Service Mesh。我们到底是该乘坐微服务的船只驶向远方,还是偏安一隅得过且过?
当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。此时,用于简化增删改查工作量的数据访问框架(ORM)是影响项目开发的关键。
存在的问题:
当访问量逐渐增大,单一应用无法满足需求,此时为了应对更高的并发和业务需求,我们根据业务功能对系统进行拆分:
优点:
缺点:
当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提高业务复用及整合的分布式调用是关键。
优点:
缺点:
当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。此时,用于提高机器利用率的资源调度和治理中心(SOA)是关键
以前出现了什么问题?
服务治理要做什么?
缺点:
前面说的SOA,英文翻译过来是面向服务。微服务,似乎也是服务,都是对系统进行拆分。因此两者非常容易混淆,但其实缺有一些差别:
微服务的特点:
无论是微服务还是SOA,都面临着服务间的远程调用。那么服务间的远程调用方式有哪些呢?
常见的远程调用方式有以下几种:
RPC:Remote Produce Call远程过程调用,类似的还有RMI。自定义数据格式,基于原生TCP通信,速度快,效率高。早期的webservice,现在热门的dubbo,都是RPC的典型
Http:http其实是一种网络传输协议,基于TCP,规定了数据传输的格式。现在客户端浏览器与服务端通信基本都是采用Http协议。也可以用来进行远程服务调用。缺点是消息封装臃肿。
现在热门的Rest风格,就可以通过http协议来实现。
既然两种方式都可以实现远程调用,我们该如何选择呢?
因此,两者都有不同的使用场景:
那么我们该怎么选择呢?
微服务,更加强调的是独立、自治、灵活。而RPC方式的限制较多,因此微服务框架中,一般都会采用基于Http的Rest风格服务。
既然微服务选择了Http,那么我们就需要考虑自己来实现对请求和响应的处理。不过开源世界已经有很多的http客户端工具,能够帮助我们做这些事情,例如:
接下来我们会使用SpringCloud,Spring最擅长的就是集成,把世界上最好的框架拿过来,集成到自己的项目中,自然也整合了这些客户端工具。
Spring提供了一个RestTemplate模板工具类,对基于Http的客户端进行了封装,并且实现了对象与json的序列化和反序列化,非常方便。RestTemplate并没有限定Http的客户端类型,而是进行了抽象,目前常用的3种都有支持:
写两个工程,一个工程springboot2提供服务,一个工程http-demo调用服务。浏览器访问http-demo,http-demo调用springboot2提供的服务,得到结果后响应浏览器。
创建maven工程springboot2:
导包
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.6.RELEASE</version> </parent> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies>
编写启动类
@SpringBootApplication
public class WebApplicationStarter {
public static void main(String[] args) {
SpringApplication.run(WebApplicationStarter.class, args);
}
}
编写User类
@Data public class User { private Long id; private String username; private String password; private String phone; private String email; private Date created; private Date updated; private String note; public User(Long id, String username, String password, String phone, String email, Date created, Date updated, String note) { super(); this.id = id; this.username = username; this.password = password; this.phone = phone; this.email = email; this.created = created; this.updated = updated; this.note = note; } }
编写UserController类
@RestController
@RequestMapping("user")
public class UserController {
@GetMapping("{id}")
public User findUser(@PathVariable("id") long id){
User user = new User(id, "tom"+id, "123456", "13456788754", "245765@qq.com", new Date(),
new Date(), "hello world!");
return user;
}
}
写完了服务提供方再写调用方工程http-demo,步骤同上
1、导包同上
2、编写配置文件application.yml,主要修改端口为8081
server:
port: 8081
3、编写启动类WebApplicationStarter
@SpringBootApplication
public class WebApplicationStarter {
@Bean //注入RestTemplate到容器中
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(WebApplicationStarter.class, args);
}
}
4、编写User类
@Data
public class User {
private Long id;
private String username;
private String password;
private String phone;
private String email;
private Date created;
private Date updated;
private String note;
//需要空参构造,json序列化需要
}
5、编写UserController
@RestController
public class UserController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("hello")
public User hello(){
String url = "http://localhost:8080/user/1";
User user = restTemplate.getForObject(url, User.class);//传入请求的服务地址和反序列化需要得到的类
return user;
}
}
文档结构图如下
启动两个项目,浏览器(这里使用了postman)访问
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。