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 根据路劲确定访问那个资源
- server
-
单体架构
- 所有的项目都在一个项目中去开发
- 特点:只打成一个jar包或者war包,只使用一个数据库
- 优点:开发简单,部署简单,开发周期短
- 缺点:团队协作困难大,协作成本高,代码jar包冲突频率高,系统发布效率低,扩展困难
- 适用场景:小项目或者创业型小企业
- 特点:只打成一个jar包或者war包,只使用一个数据库
- 所有的项目都在一个项目中去开发
-
微服务架构
-
服务:提供一个完整的功能的内容!(小到工具类、接口,大到一个工程模块),实际开发中具备独立完整功能一个项目模块
-
核心思想:拆分(横向拆分、垂直拆分)
-
特点:
- 每一个服务连接单独的数据库
- 每一个服务单独打包,单独部署
- 指责单一
- 团队协作方便(团队自治)
- 服务自治
-
优点:
-
有利于项目的扩展与维护服务之间解耦,易于理解和维护
-
每个服务可以独立扩展,提高资源利用效率
-
-
缺点:
- 项目复杂性增加
- 管理困难
- 不便于维护和监控
-
适用场景:大型公司
微服务项目一定是分布式项目
-
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注解
现在重启项目即可
动态代理
1、动态代理(dynamic proxy)
在运行时候,在JVM中动态 针对某一个类或者接口,产生一个对象
特点:在不改变原有的类或者方法的基础上实现对类或者方法的增强
2、实现方法
- 方法一:java的jdk中提供了一个类 Proxy静态方法 newProxyInstance(参数1,参数2,参数3)
- 参数1:类加载器:负责加载.class文件到jvm内存
- 方式二:Cglib中提供了一个类 Enhancer(英文:增强),方法 setSupperClass(...)
3、为什么要使用动态代理
增强一个类,在基础阶段,只有一种手段 就是继承!继承来实现类增强是有缺陷的,会造成子类爆炸,而且对方法破坏!于是动态代理就产生了,在不改变原有的代码的基础上对代码进行增强。
开发步骤:
- 必须要先定义一个接口
- 基于接口定义一个实现类
- 基于Proxy产生代理对象