springcloud

一、项目架构演变过程

1、单体应用架构

当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。此时,用于简化增删改查工作量的数据访问框架(ORM)是关键。

适用于小型网站,小型管理系统,将所有功能都部署到一个功能里,简单易用。

缺点:1、性能扩展比较难 2、协同开发问题 3、不利于升级维护

2、垂直应用架构

当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。此时,用于加速前端页面开发的Web框架(MVC)是关键。

通过切分业务来实现各个模块独立部署降低了维护和部署的难度,团队各司其职更易管理,性能扩展也更方便,更有针对性。

缺点:公用模块无法重复利用,开发性的浪费

3、分布式服务架构

当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提高业务复用及整合的分布式服务框架是关键。

4、流动计算架构(SOA架构)

当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。此时,用于提高机器利用率的资源调度和治理中心(SOA)[Service Oriented Architecture]是关键

5、微服务架构

微服务架构的特点

单一职责:微服务架构中每一个服务(模块项目)都对应唯一的业务能力,做到单一职责

微:微服务的服务拆分粒度很小,例如一个用户管理就可以作为一个服务。每个服务虽小,但“五脏俱全”。

面向服务:面向服务是说每个服务都要对外暴露Restful风格服务接口API。并不关心服务的技术实现,做到与平台和语言无关,也不限定用什么技术实现,只要提供Restful的接口即可。

自治:自治是说服务间互相独立,互不干扰

团队独立:每个服务都是一个独立的开发团队,人数不能过多。

技术独立:因为是面向服务,提供Restfule接口,使用什么技术没有别人干涉

前后端分离:采用前后端分离开发,提供统一Rest接口,后端不用再为PC、移动段开发不同接口

数据库分离:每个服务都使用自己的数据源部署独立,服务间虽然有调用,但要做到服务重启不影响其它服务。有利于持续集成和持续交付。每个服务都是独立的组件,可复用,可替换,降低耦合,易维护

二、如何实现微服务远程调用

1、HttpClient工具类(springboot中)

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
</dependency>
形式1:调用第三方的公开服务
package com.hl.web;
​
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
​
import java.io.IOException;
​
@RestController
public class HelloController {
    @RequestMapping("/hello")
    public Object hello() throws IOException {
        //发起网络请求,调用百度接口
        //1、构建一个HttpClient对象
        CloseableHttpClient client = HttpClientBuilder.create().build();
        //2、封装一个httpGet 或者 post请求
        HttpGet request = new HttpGet("http://www.baidu.com");
        //3、发起网络请求,获取响应对象
        CloseableHttpResponse response = client.execute(request);
        //4、解析响应结果
        Integer code = response.getStatusLine().getStatusCode();
        System.out.println("响应状态码:"+code);
        HttpEntity entity = response.getEntity();
        return EntityUtils.toString(entity);
    }
}
形式2:创建两个微服务,两个服务之间进行远程服务调用

http://localhost:8081/user/info

@RequestMapping("/info")
public Object info() throws IOException {
    //发起网络请求,调用百度接口
    //1、构建一个HttpClient对象
    CloseableHttpClient client = HttpClientBuilder.create().build();
    //2、封装一个httpGet 或者 post请求
    HttpGet request = new HttpGet("http://localhost:8081/user/info");
    //3、发起网络请求,获取响应对象
    CloseableHttpResponse response = client.execute(request);
    //4、解析响应结果
    Integer code = response.getStatusLine().getStatusCode();
    System.out.println("响应状态码:"+code);
    HttpEntity entity = response.getEntity();
    return EntityUtils.toString(entity);
}
@RestController
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/info")
    public User info(){
        return new User(1,"admin");
    }
}
@RequestMapping("/info")
public Object info() throws IOException {
    //发起网络请求,调用百度接口
    //1、构建一个HttpClient对象
    CloseableHttpClient client = HttpClientBuilder.create().build();
    //2、封装一个httpGet 或者 post请求
    HttpGet request = new HttpGet("http://localhost:8081/user/info");
    //3、发起网络请求,获取响应对象
    CloseableHttpResponse response = client.execute(request);
    //4、解析响应结果
    Integer code = response.getStatusLine().getStatusCode();
    System.out.println("响应状态码:"+code);
    HttpEntity entity = response.getEntity();
    String s = EntityUtils.toString(entity);
    User user = JSONObject.parseObject(s,User.class);
    return user;
}

2、RestTemplate工具类(springboot中)

@SpringBootApplication
public class ProjectAApplication {
    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}
@RestController
public class HelloController {
    @Autowired
    private RestTemplate restTemplate;
​
    @RequestMapping("/getUser")
    public User getUser(){
        return restTemplate.getForObject("http://localhost:8081/user/info", User.class);
    }
}

3、openFeign组件(springcloud中)

三、微服务架构的实现方式

1、dubbo(都是java语言开发的)

有Alibaba研发,后转给apache维护。

2、springcloud(不限制语言)

spring组织提供的。 http协议远程调用

四、springcloud相关组件

nacos注册中心
loadBalancer
openFeign
gateway
nacos配置中心
sentinel

五、nacos注册中心

1、搭建nacos注册中心

下载解压缩到非中文目录

启动nacos服务(默认集群模式启动)

以单机版模式启动服务
​
startup.cmd -m standalone

http://localhost:8848/nacos/

用户名nacos 密码nacos

2、注册微服务到nacos注册中心

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
@SpringBootApplication
@EnableDiscoveryClient //启用服务发现组件的客户端
public class ProjectCApplication {

    public static void main(String[] args) {
        SpringApplication.run(ProjectCApplication.class, args);
    }

}
# Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html
#当前项目在nacos注册中心暴漏的服务名
spring.application.name=projectC
# Nacos认证信息
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
# Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
spring.cloud.nacos.discovery.server-addr=localhost:8848
# 注册到 nacos 的指定 namespace,默认为 public
spring.cloud.nacos.discovery.namespace=public
# 应用服务 WEB 访问端口
server.port=8082

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值