SpringCodel微服务

SpringCodel微服务

docker启动命令:

systemctl start docker   启动docker
systemctl status docker  查看docker状态
systemctl enable docker  设置开机自启

设置容器开机自启

docker update status=aways 容器名

docker ps 格式化输出容器内容

(1)--format "docker ps --format 'table {{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Ports}}\t"

(2)自定义系统命令别名 /root/.bashrc

(3) 完成修改后需要让目录刷新一下 source /root/.bashrc

git查看用户名和emial命令

git config --global --list       查看


修改
git config --global user.name "你的名字"
git config --global user.email "你的邮箱"

注意:修改需要新建一个目录,在新的目录里面去修改,不然改不了,对之前创建和使用的仓库不生效

SPI 自动加载,不根据包扫描 、、条件配置@ConditionalOnClass

  • nginx 配置文件 /conf/nginx.conf
  • 重要配置节点 http (发送的是http请求,此时就被这个节点处理)
    • server
      • listen (根据端口号决定找哪个server(虚拟主机))
      • location 根据路劲确定访问那个资源

  • 单体架构

    • 所有的项目都在一个项目中去开发
      • 特点:只打成一个jar包或者war包,只使用一个数据库
        • 优点:开发简单,部署简单,开发周期短
        • 缺点:团队协作困难大,协作成本高,代码jar包冲突频率高,系统发布效率低,扩展困难
      • 适用场景:小项目或者创业型小企业
  • 微服务架构

    • 服务:提供一个完整的功能的内容!(小到工具类、接口,大到一个工程模块),实际开发中具备独立完整功能一个项目模块

    • 核心思想:拆分(横向拆分、垂直拆分)

    • 特点:

      • 每一个服务连接单独的数据库
      • 每一个服务单独打包,单独部署
      • 指责单一
      • 团队协作方便(团队自治)
      • 服务自治
    • 优点:

      • 有利于项目的扩展与维护服务之间解耦,易于理解和维护

      • 每个服务可以独立扩展,提高资源利用效率

    • 缺点:

      • 项目复杂性增加
      • 管理困难
      • 不便于维护和监控
    • 适用场景:大型公司

    微服务项目一定是分布式项目

springCloud

  • spring cloud
    • spring cloud 微服务开发组件集合
    • spring cloud 和 spring boot
      • spring clode 是基于spring boot 他俩是一一对应的
      • spring cloud 是按照spring boot 约定编写的组件
    • spring cloud Alibaba
      • spring cloud 汇集 全球知名顶尖公司 微服务开发过程中长期时间的好用的组件和解决方案的集合!

springboot与springCloud的版本控制

@RequiredArgsConstructor 自动创建构造器 构造器注入

负载均衡

服务端负载均衡

  • 客户端:服务调用方称为客户端(购物车服务)
  • 服务端:服务被调用方成为服务端(商品服务)

Nginx负载均衡

在nginx中,conf/conf.html文件中修改 添加这一段

http {
    upstream item_services {
        server 127.0.0.1:8081 weight=3;  # 分配较高权重
        server 127.0.0.1:7081 weight=2;  # 分配中等权重
        server 127.0.0.1:6081 weight=1;  # 分配较低权重
    }

    server {
        listen       80;  # 监听 80 端口,也可以根据需要更改
        server_name  localhost;  # 更改为你的域名或 IP 地址

        location /items {  # 这里可以根据需要调整路径前缀
            proxy_pass http://item_services;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;

            # 其他可选配置
            proxy_redirect off;
            proxy_buffering off;
            proxy_read_timeout 90;
        }
    }
}

添加完成后

重启或者重新加载nginx,需要在nginx所在的目录cmd,然后输入命令

1、首先需要向IOC容器中注入RestTemplate,RestTemplate用来进行发网络请求

2、首先先要在实现类里面注入RestTemplate

3、然后调用它里面的exchange方法

restTemplate.exchange("请求路径","请求方式","请求实体","返回值类型","请求参数")

		ResponseEntity<List<ItemDTO>> response = restTemplate.exchange("http://localhost:80/items?ids={ids}",
             HttpMethod.GET,//请求方式
             null,//请求实体
             new ParameterizedTypeReference<List<ItemDTO>>() {},//返回值类型
             CollUtils.join(itemIds, ","));//请求参数
        //处理结果
        List<ItemDTO> items = null;
        if(response.getStatusCode().is2xxSuccessful()){
            //查询成功,获取响应结果
            items = response.getBody();
        }

这样nginx就能实现负载均衡,根据权重能分发请求了。

服务端负载均衡是客户端请求到Nginx服务端有Nginx实现负载均衡。

客户端负载均衡是客户端在发起调用时自己实现了负载均衡的作用,自己通过负载均衡算法找到一个目标服务进行调用。

服务注册与发现流程

注册中心:提供服务注册接口,接受服务注册请求,保存服务实例信息,开源的注册中心中间件有很多,如Eureka、Nacos、Consul等

服务提供者:服务接口提供方,请求注册中心将服务信息注册到注册中心。

服务调用者:远程调用客户端,请求注册中心查询服务地址,通过负载均衡器选取目标服务地址进行调用。

服务注册于发现的流程:

  • 服务启动时就会注册自己的服务信息到注册中心。
  • 调用者可以从注册中心订阅想要的服务
  • 调用者作为客户端自己通过负载均衡算法挑选一个服务提供者实例进行远程调用,即客户端负载均衡
  • 调用者向该实例发起远程调用

代码实现步骤:

  • 引入依赖
  • 配置Nacos地址
  • 重启项目

依赖

<!--spring cloud-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-dependencies</artifactId>
    <version>${spring-cloud.version}</version>
    <!--   type=pom ,scope=import 表示继承 和 parent 作用一样             -->
    <type>pom</type>
    <scope>import</scope>
</dependency>
<!--spring cloud alibaba-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>${spring-cloud-alibaba.version}</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

约定nacos-client版本

<dependency>
    <groupId>com.alibaba.nacos</groupId>
    <artifactId>nacos-client</artifactId>
    <version>2.4.0</version>
</dependency>

在服务提供者里面添加依赖,让nacos发现,项目启动时能够注册到注册中心

<!--nacos 服务注册发现-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

导完依赖后还需要再配置文件中加入这段代码

spring:
  application:
    name: item-service # 服务名称
  cloud:
    nacos:
      server-addr: 192.168.101.68:8848 # nacos地址

做完以上操作后即可重启项目,项目启动时,需要注意观察log日志,如果出现Success to connect to server [192.168.101.68:8848] on start up, connectionId ... 则表示注册成功

访问http://192.168.101.68:8848/nacos/即可看到

但是现在又是服务端跟注册中心连接了,而客户端还没有,所以现在需要让客户端也连接注册中心

<!--nacos 服务注册发现-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
spring:
  application:
    name: item-service # 服务名称
  cloud:
    nacos:
      server-addr: 192.168.101.68:8848 # nacos地址

这样客户端就能连接上注册中心了

但是现在这个服务名称nacos不认识,它只是一个地址,所以,此时需要负载均衡器

在服务提供者里面引入负载均衡器

<!--负载均衡器-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

此时nacos就可以通过负载均衡器来获取地址了,但是restTemplent它不知道,所以还得给它加一个注解@LoabBalanced

在新版本的SpringCloud中使用负载均衡器是 loadbalancer 而不再使用ribbion 应为它已经被淘汰了

OpenFeign

使用以上方式,代码量多,容易写错,所以使用OpenFeign能够大大减少代码错误,并且代码量也减少了很多

OpenFeign 是用来简化微服务间调用的组件!

开发步骤:

  • 引入依赖
  • 开发一个接口 @FeignClient 定义一个方法(参考服务提供方的controller)
  • 在引导类开启feign调用@EnableFeignClients

1、在服务的调用放引入OpenFeign 依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--负载均衡器-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

2、创建一个接口

@FeignClient(name = "item-service" path="/items")
public interface ItemClient {
    @GetMapping("/{id}")
    Item getItem(@PathVariable("id") String id);(根据提供方的controller来写)
}

3、在代码中注入接口

4、实现方法

5、在启动类上加@EnableFeignClients注解

现在重启项目即可

nacos名称空间

#给nacos单独起一个名称空间,作用就是隔离性,与其他的名称空间进行隔离
discovery:
  namespace: 47e36e15-b90c-4989-bbad-4e22c1f7cbeb

一张图解决

posted @ 2024-12-19 14:32  听宏  阅读(50)  评论(0)    收藏  举报