分析pom.xml的依赖包组件:pom文件查看必备的微服务组件。
SpringCloud(多种框架组件技术集合的总框架)笔记
传统单体架构VS微服务分布式架构
单体架构特点?
分布式架构特点?
微服务:一种良好的分布式架构方案
微服务是一种经过良好架构设计的分布式架构方案,微服务架构特征:
先是拆分为微服务,然后注册每个微服务,接着配置微服务之间的调用关系,最后管理微服务之间的通信。
微服务技术栈必备组件:
1、拆分为微服务集群的框架
spring boot构建平台,spring cloud搭建微服务。
微服务这种方案需要技术框架来落地,全球的互联网公司都在积极尝试自己的微服务落地技术。
在国内最知名的就是SpringCloud和阿里巴巴Dubbo。
SpringCloud是目前国内使用最广泛的微服务框架。
2、注册中心:(解决去哪里找微服务以及微服务功能,例:Nacos)
3、配置中心:(配置服务消费者和提供者:Feign,HSF等)
4、消息队列:
5、服务网关:(例:Nginx,GateWay)
SpringCloudAlibaba兼容前两种方案
企业需求(实际应用)
spring boot构建平台,spring cloud搭建微服务。
解决去哪里找微服务以及微服务功能
提供者和消费者
服务调用关系
Eureka作用
在Eureka架构中,微服务角色有两类
EurekaServer:服务端,注册中心
EurekaClient:客户端
总结
消费者该如何获取服务提供者具体信息?
如果有多个服务提供者,消费者该如何选择?
消费者如何感知服务提供者健康状态?
搭建EurekaServer微服务步骤如下:
org.springframework.cloud
spring-cloud-starter-netflix-eureka-server
server:
port: 10086
spring:
application:
name: eurekaserver
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka/
将user-service服务注册到EurekaServer步骤如下:
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
spring:
application:
name: userservice
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka/
在order-service完成服务拉取
服务拉取是基于服务名称获取服务列表,然后在对服务列表做负载均衡
String url = "http://userservice/user/" + order.getUserId();
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
注意:ribbon组件不用了 现在用springcloud LoadBalancer
发起请求方添加LoadBalanced注解则可以实现负载均衡。
1、利用拦截器拦截请求获取请求的服务名称
2、根据名称获取注册的服务列表
3、从列表中根据规则(如随机、轮询等)选取一个服务
4、根据选取的服务执行请求
Eureka服务注册以注册的服务名为单位:一个服务名可以注册多个微服务实例为Ribbon负载均衡提供条件。
一个服务名来注册多个实例来实现负载均衡。这个概念在分布式系统中被称为服务发现和服务注册。
Eureka服务调用也是以注册的服务名代表IP:PORT,类似域名代表IP:PORT。
Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件。相比Eureka功能更加丰富,在国内受欢迎程度较高。
默认端口8848
1、在cloud-demo父工程中添加spring-cloud-alilbaba的管理依赖:
com.alibaba.cloud
spring-cloud-alibaba-dependencies
2.2.6.RELEASE
pom
import
2、注释掉order-service和user-service中原有的eureka依赖。
3、添加nacos的客户端依赖:
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
4、修改user-service&order-service中的application.yml文件,注释eureka地址,添加nacos地址:
spring:
cloud:
nacos:
server-addr: localhost:18808#nacos服务端地址
注册中心注册微服务流程
1、配置注册中心服务或父工程。
2、客户端微服务导入注册中心客户端依赖,配置文件配置包含注册中心IP:PORT==登记微服务IP:PORT。
负载均衡的物理前提
一个服务名来注册多个实例来实现负载均衡。这个概念在分布式系统中被称为服务发现和服务注册。
微服务之间的远程调用方式
微服务调用方式
启动类
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
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);
}
/*创建restTemplate*/
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
service调用代码
package cn.itcast.order.service;
import cn.itcast.order.mapper.OrderMapper;
import cn.itcast.order.pojo.Order;
import cn.itcast.order.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import java.awt.geom.RectangularShape;
@Service
public class OrderService {
@Autowired
private OrderMapper orderMapper;
@Autowired
private RestTemplate restTemplate;
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
String url="http://userservice/user/"+order.getUserId();
User user=restTemplate.getForObject(url,User.class);
order.setUser(user);
// 4.返回
return order;
}
}
key键冒号后需要带个空格与value间隔
原因:如果value是url则会带:,通过有没有空格来区分key和value。
标准格式
key: value