SpringCloud

1.微服务远程调用

为了实现远程调用,首先在调用方注册RestTemplate

 

 其次在调用方法下使用RestTemplate的方法

 如果是get就用get方法,如果是Post就用post方法

实例中getForObject返回的是Json对象,但是直接给实体类class的话会自动反序列化为对应实体类

 2.Eureka注册中心

1.准备工作

1)添加依赖

 

 <dependencies>
<!-- eureka服务端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>

由于父工程springcloud的spring0cloud-dependencies管理着因此没有版本号

 

 2)添加启动注解

 

 3)配置文件

 

 配置完成之后启动Eurekaapplication显示

 

 2.服务注册

1)在对应需要注册的服务添加依赖

 

 <!-- eureka客户端依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

2)配置文件更新

将eureka配置信息更新到服务配置文件即可

 

 按照同样步骤配置orderservice

测试结果,可以看到三个服务均已完成注册

 

 3)多实例启动

以上为单个实例启动,如果需要同一服务多实例启动,以user服务为例

 

 在copy configuration下配置环境VM

 

 配置完成后出现新的服务实例

 

 启动后测试完成

 

 3.服务拉取

1)修改调用方预调用Url

url中之前写死的localhost更改为服务名称(从服务方配置文件中copy)

 

 2)添加负载均衡注解

3.Ribbon负载均衡

1.负载均衡流程

个人理解消费者调用服务发起请求,通过负载均衡拦截器向eureka服务端获取服务列表,再结合IRule接口下的算法即负载均衡策略确定服务端口,最终将请求发送到消费者

 

 

2.修改负载均衡策略

1)方案一(全局方案)

在配置类中定义Bean修改负载均衡策略

 

 2)方案二(针对具体的某个服务)

userservice下的负载均衡策略

 

 3.饥饿加载

Ribbon默认为懒加载,即第一次调用时才拉取服务,耗时较长

在调用方进行设置

 

4.Nacos

 1.准备工作

1)在父工程引入依赖

 

<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>

 2)修改子工程依赖,将eureka依赖替换成nacos依赖

 

 <dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

3)yml文件配置

 

 2.服务注册发现

由于Springcloud common定义了共同的接口,只需要将pom以及yml文件配置完成,不修改eureka使用时的代码即可使用Nacos

3.启动服务

在安装路径bin文件中cmd输入startup.cmd -m standalone

 

 成功启动后输入console地址即可进入登录界面,默认账号密码均为nacos

 

 4.集群定义

1)消费者定义

修改yml

 

 测试结果

 

 在yml中再次更换集群名称,启动未开启的服务

 

 2)服务者定义

假设该服务者处于PZH集群,首先进行pml配置

 

 集群内部应该优先访问,即PZH的消费者访问PZH的服务者,pml配置,定义负债均衡的规则(集群优先,本质是随机)

 3)权重分配

当同一集群中服务器老旧不一,可以调整权重从而保证服务器访问频率不同

 

 

 

 4)环境隔离

开辟新的命名空间实现环境隔离,ID可以不设置自动通过UUID进行设置

 

 

 

 ID生成之后可将其设置到yml文件中,从而使对应服务处于该命名空间下从而实现与其他服务的环境隔离,其他服务无法再访问调用该服务

 5.配置管理

1)新建配置管理

 

 ID一般以微服务名称及生产开发环境命名,配置内容主要写可能需要热更新、未来有变化的配置

 2)统一配置管理

在需要配置的微服务中引入依赖

 

<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
 

在resources下添加bootstrap.yml,名称、开发环境及后缀与nacos管理的配置一致,注意在配置时将application.yml中相同的信息删除

 

 3)测试

由于nacos管理的配置下定义了日期格式,因此在Controller中定义方法

 

 4)配置热更新

方式一:在Controller上添加@RefreshScope

 

 方式二:使用@ConfigurationProperties注解

新建一个注册类,注意注解添加前缀,只有前缀+字段名相符,配置文件才能被读取

 

 修改Controller文件

5)多环境配置共享

 

6)集群搭建

搭建数据库,初始化数据库表结构

Nacos安装配置,集群配置与单机配置有些许区别

启动nacos集群,启动命令为startup.cmd

nginx反向代理

 5.Feigh

1.远程调用

使用resttemplate时的调用

 

 

1)依赖注入

 

 

 <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2)添加注解

之后在启动类添加注解@EnableFeignClients

 

 3)编写调用接口

 

 4)修改方法

 

 2.自定义配置

1)配置Feigh日志

方式一:配置文件方式

全局配置

 

局部配置则将default修改为具体的服务名称即可

 方式二:java代码方式

首先定义配置类

 

 全局配置,在启动类加注解

 

 局部配置,则在对应的类添加注解

 3.Feign的性能优化

1)使用连接池代替默认的URLConnection

添加依赖

<!--        引入HttpClient依赖-->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>

配置连接池

 

 

2)日志级别,最好用basic或none

4.Feign的最佳实践

1)让Controller和FeignClient继承统一接口(不推荐)

2)将FeignClient、POJO、Feign的默认配置都定义到一个项目中,供所有消费者使用

 首先创建Feign-Api模块,引入依赖

 

 将order-service下的Feign相关类接口转移到该模块下

 

 由于在oder-service将之前的user删除了,因此导入Feign-api模组

 

 启动测试时发现orderservice报错,原因在于启动扫描的包下已经没有了userClient这个类,没有注入到Spring中进行管理

 

 

 解决方式:

在启动类下指定Feignapi模块下的类

 

 

 6.网关Gateway

1.搭建网关服务

 添加依赖

 

 <dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

创建服务主函数

 

2.编写路由配置及nacos地址

其中路由id一定要唯一

路由目标uri http则代表固定地址,lb代表根据服务名负载均衡

路由断言,判断路由的规则

 

 流程图:

3.路由断言工厂

 

4.过滤器工厂

作用是对路由进行处理,具体类型可查看Spring官网,下面以AddRequestHeader为例

首先在gateway的配置文件中定义过滤器

 

 在某个微服务下提取请求头

 

 网页查找时后台会打印

 

 5.全局过滤器

全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter类似

但区别在于GatewayFilter需要配置定义,处理逻辑固定,但是GlobalFilter逻辑需要代码实现,更符合个人想法实现自由

例子为登录时验证的过滤

 

 对于执行顺序,也可以采用实现接口ordered的方式

 

 结果显示只有当请求头存在要求值才能够获取参数

 

 6.过滤器执行顺序

每一个过滤器都必须指定一个int类型的Order值,order值越小,优先级越高,执行顺序越靠前

GlobalFilter通过实现Ordered接口,或者添加@Order注解来指定值

路由过滤器和defaultFilter的order由Spring指定,默认是按照声明顺序从1递增

当过滤器的Order值一致时,会按照默认过滤器>路由过滤器>GlobalFilter的顺序执行

7.跨域问题处理

域名不一致或者端口不一致就是跨域

跨域问题:浏览器禁止请求的发起者与服务端发生跨域Ajax请求,请求呗浏览器拦截的问题

在gateway配置文件中配置

 

posted @ 2022-05-28 11:26  面向机器编程  阅读(27)  评论(0编辑  收藏  举报