SpringCloud01
微服务入门案例
实现步骤
-
- 导入数据
-
- 实现远程调用
@MapperScan("cn.itcast.order.mapper") @SpringBootApplication public class OrderApplication { public static void main(String[] args) { SpringApplication.run(OrderApplication.class, args); } /** * 将redisTemplate加入spring容器当中 * @return */ @Bean public RestTemplate restTemplate(){ return new RestTemplate(); } }
@Service public class OrderService { @Autowired private OrderMapper orderMapper; @Autowired private RestTemplate restTemplate; public Order queryOrderById(Long orderId) { // 1.查询订单 Order order = orderMapper.findById(orderId); //2. 查询用户信息 //2.1 url路径 String url = "http://localhost:8081/user/"+order.getUserId(); //2.2 发送http请求,实现远程调用 User user = restTemplate.getForObject(url, User.class); //3.封装order数据 order.setUser(user); // 4.返回 return order; } }
@Slf4j @RestController @RequestMapping("/user") public class UserController{ @Autowired private UserService userService; /** * 路径: /user/110 * * @param id 用户id * @return 用户 */ @GetMapping("/{id}") public User queryById(@PathVariable("id") Long id) { return userService.queryById(id); } }
Eureka注册中心
结构
入门案例
-
实现步骤
-
- 创建eureka服务,引入依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
-
-
-
编写启动类
@SpringBootApplication @EnableEurekaServer public class EurekaApplication { public static void main(String[] args) { SpringApplication.run(EurekaApplication.class, args); } }
-
- 编写配置文件
server: port: 10086 # 服务端口 # 以下配置为注册服务 spring: application: # 微服务名称 name: eureka-server eureka: client: register-with-eureka: true # 是否注册自己 fetch-registry: true #是否拉取服务,获取Eureka中的注册表信息,也就是我们注册到注册中心的服务 service-url: # eureka的地址信息,eureka本身也是一个微服务,会将自身注册到eureka上 defaultZone: http://127.0.0.1:10086/eureka
-
- 服务注册
-
- 引入依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
-
- 编写配置
spring: application: name: userservice eureka: client: service-url: defaultZone: http://127.0.0.1:10086/eureka
-
- 服务发现
-
- 引入依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
-
- 编写配置
spring: application: name: orderservice eureka: client: service-url: defaultZone: http://127.0.0.1:10086/eureka
-
- 服务拉取与负载均衡
添加@LoadBalanced注解
@MapperScan("cn.itcast.order.mapper") @SpringBootApplication public class OrderApplication { public static void main(String[] args) { SpringApplication.run(OrderApplication.class, args); } /** * 将redisTemplate加入spring容器当中 * @return */ @Bean @LoadBalanced//实现自动获取实例列表,并完成负载均衡 public RestTemplate restTemplate(){ return new RestTemplate(); } }
@Service public class OrderService { @Autowired private OrderMapper orderMapper; @Autowired private RestTemplate restTemplate; public Order queryOrderById(Long orderId) { // 1.查询订单 Order order = orderMapper.findById(orderId); //2. 查询用户信息 //2.1 url路径 //String url = "http://localhost:8081/user/"+order.getUserId(); //使用服务名代替ip和端口 String url = "http://userservice/user/"+order.getUserId(); //2.2 发送http请求,实现远程调用 User user = restTemplate.getForObject(url, User.class); //3.封装order数据 order.setUser(user); // 4.返回 return order; } }
-
Ribbon负载均衡
原理
流程
- 拦截我们的RestTemplate请求http://userservice/user/1
- RibbonLoadBalancerClient会从请求url中获取服务名称,也就是user-service
- DynamicServerListLoadBalancer根据user-service到eureka拉取服务列表
- eureka返回列表,localhost:8081、localhost:8082
- IRule利用内置负载均衡规则,从列表中选择一个,例如localhost:8081
- RibbonLoadBalancerClient修改请求地址,用localhost:8081替代userservice,得到http://localhost:8081/user/1,发起真实请求
饥饿加载
- Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长。
而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面配置开启饥饿加载:
# 开启饥饿加载,降低第一次访问时间
# 默认使用的时懒加载,即第一次访问时才创建loadBalanceClient
# clients为集合,若存在多个服务,需要使用如下方式配置
ribbon:
eager-load:
clients:
- userservice # 指定饥饿加载的服务名称
# - xxxxservice
enabled: true # 开启饥饿加载
Nacos注册中心
服务注册到nacos
-
实现步骤
-
- 引入依赖
父工程引入SpringCloudAlibaba的依赖
<dependency> <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> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
-
- 配置nacos地址
spring: cloud: nacos: server-addr: localhost:8848
-
nacos服务分级存储模型
-
介绍
-
集群配置
修改order-service的application.yml文件,添加集群配置:
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: HZ # 集群名称
- 同集群优先配置
修改order-service的application.yml文件,修改负载均衡规则:
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
- 权重配置
-
环境隔离
-
实现步骤
-
- 创建namespace
-
-
- 2. 编写配置文件
```yml
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: HZ
namespace: 492a7d5d-237b-46a1-a99a-fa8e98e4b0f9 # 命名空间,填ID
```
eureka与nacos的区别
nacos服务实例分类
- 临时实例
如果实例宕机超过一定时间,会从服务列表剔除,默认的类型。
- 非临时实例
如果实例宕机,不会从服务列表剔除,也可以叫永久实例。
配置一个服务实例为永久实例:
spring:
cloud:
nacos:
discovery:
ephemeral: false # 设置为非临时实例
共同点
- 都支持服务注册和服务拉取
- 都支持服务提供者心跳方式做健康检测
区别
- Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
- 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
- Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
- Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式