分析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/
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
临时实例可以手动开关,Nacos动态剔除已关闭临时实例的注册信息,非临时实例反之,Nacos不动态剔除反而报错并持续监测实例状态是否复活。

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服务端地址

5、启动并测试:

同一服务名的多个实例,分集群存放在异地。
Nacos服务分级存储模型
如何设置实例的集群属性
配置步骤:
apllication.yml
cloud:
nacos:
server-addr: localhost:18808 #nacos服务端地址
discovery:
cluster-name: HZ # 配置集群名称,也就是机房位置,例如:HZ,杭州


NacosRule负载均衡策略
1、修改order-service中的application.yml,设置集群为HZ:
spring:
cloud:
nacos:
server-addr: localhost:8848 # nacos 服务端地址
discovery:
cluster-name: HZ # 配置集群名称,也就是机房位置
2、然后在order-service中设置负载均衡的IRule为NacosRule,这个规则优先会寻找与自己同集群的服务:
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
借助Nacos自身可视化页面调整权重
实例的权重控制
实际部署中会出现这样的场景: 服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求
Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高
1、在Nacos控制台可以设置实例的权重值,首先选中实例后面的编辑按钮

2、将权重设置为0.1,测试可以发现8081被访问到的频率大大降低

Nacos环境隔离
Namespace命名空间包含Group集群,Group集群包含Service实例.
集群包含服务,服务包含集群 集群包含实例

1、在Nacos控制台可以创建namespace,用来隔离不同环境

2、然后填写一个新的命名空间信息:

3、保存后会在控制台看到这个命名空间的id:

4、修改order-service的application.yml,添加namespace:
spring:
datasource:
url: jdbc:mysql://localhost:3306/heima?useSSL=false
username: root
password: 123
driver-class-name: com.mysql.jdbc.Driver
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: SH # 上海
namespace: 492a7d5d-237b-46a1-a99a-fa8e98e4b0f9 # 命名空间,填ID
5、重启order-service后,再来查看控制台:

6、此时访问order-service,因为namespace不同,会导致找不到userservice,控制台会报错:

Nacos与eureka的共同点
Nacos与Eureka的区别
注册中心注册微服务流程
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
图中这种key键泛白的就是格式错误。

正确格式
