springcloud
springcloud笔记(实用篇day01)
1.1. 案例(使用的是RestTemplate)
因此,我们需要在order-service中 向user-service发起一个http的请求,调用http://localhost:8081/user/{userId}这个接口。
-
使用我们的一个RestTemplate到我们的spirng容器里面去
-
修改order-service服务中的OrderService类中的queryOrderById方法,根据Order对象中的userId查询User
-
将查询的User填充到Order对象,一起返回
1.2.注册RestTemplate
首先,我们在order-service服务中的OrderApplication启动类中,注册RestTemplate实例:
package cn.itcast.order;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
@Bean // 定义成bean才能注入到spring容器里面
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
1.3.实现远程的调用
1.4.服务中心
1.4.1.为什么要有服务中心
原因:
-
order-service如何得知某个user-service实例是否依然健康,是不是已经宕机?(需要知道健康情况)
-
有多个user-service实例地址,order-service调用时该如何选择?
因此我们需要一个将所有的微服务都提交到服务中心去让他来管来我们的微服务(知道每个微服务的一些情况)
1.5.Nacos注册中心
1)引入依赖
在cloud-demo父工程的pom文件中的<dependencyManagement>
中引入SpringCloudAlibaba的依赖:
<dependency>
<!--相当于给夫妇加上了alibaba的依赖-->
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
在两个子类里面加入nacos的发现依赖 这样才能知道有两个要注册进去
<dependency>
<!--nacos发现依赖-->
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
给我们orderservice 和userservice的yml配置里面加上我们的注册一些信息
spring: # 这个是userservice的yaml 同理orderservice也是如此
application:
name: user-service # 表示userservice在nacos的服务名称很重要的
cloud:
nacos:
server-addr: localhost:8848 # 这个表示我们nacos的服务地址
下面就是最终效果
1.5.1.负载均衡配置
让我们的user-service这个服务进行负载均衡 (到时候启用的时候实现多个port)
在order-service的OrderApplication中,给RestTemplate这个Bean添加一个@LoadBalanced注解:
修改order-service服务中的cn.itcast.order.service包下的OrderService类中的queryOrderById方法。修改访问的url路径,用服务名代替ip、端口:
spring会自动帮助我们从nacos端,根据user-service这个服务名称,获取实例列表,而后完成负载均衡。
1.5.2.自定义负载均衡策略
有两种方法:
1.方法一:就是在orderservice里面的启动类上加上:(IRule)
@Bean // 成为容器 被spring扫描到
public IRule randomRule(){
return new RandomRule();
}
2.方法二:在orderservice的yml配置文件里面进行配置
user-service: # 给某个微服务配置负载均衡规则,这里是user-service服务(这个是服务的名称)
ribbon: # 使用的是ribbon的负载均衡
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则
个人更倾向于第一种(不需要记很多的东西)
注意,一般用默认的负载均衡规则,不做修改。
1.5.3.服务分级存储模型
微服务互相访问时,应该尽可能访问同集群实例,因为本地访问速度更快。当本集群内不可用时,才访问其它集群。
1.5.4.搭建微服务之间的集群模式
修改userservice里面的yaml配置文件
spring:
cloud:
nacos:
server-addr: localhost:8848
# 下面两行就是集群的搭建
discovery:
cluster-name: HZ # 集群名称
最终效果:
1.5.5.同集群优先的负载均衡
因为我们的order-service服务并没有开启集群所以我们user-service有多个集群的话他不会优先访问我们相同集群的服务,所以我们要进行配置。
- 修改order-service的application.yml文件,添加集群配置:
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery: # 这个是我们order-service服务的集群
cluster-name: HZ # 集群名称
2.下面就配置统一集群优先访问(对原来的负载均衡进行修改)
user-service: # 这个是服务的名称
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
权重的修改就去nacos里面去修改 权重越低负载均衡的情况下被访问到的概率就越低
1.5.6.环境隔离
Nacos提供了namespace来实现环境隔离功能。
- nacos中可以有多个namespace
- namespace下可以有group、service等
- 不同namespace之间相互隔离,例如不同namespace的服务互相不可见
在nacos里面添加一个命名空间
1.5.6.1.给微服务配置namespace
例如,修改order-service的application.yml文件:
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: HZ
# 添加命名空间(然后就进行了隔离了)
namespace: 492a7d5d-237b-46a1-a99a-fa8e98e4b0f9 # 命名空间,填ID
此时访问order-service,因为namespace不同,会导致找不到userservice,控制台会报错:
就无法访问到我们的user-service的服务了。
1.6