https://www.bilibili.com/video/BV1LQ4y127n4
异步通信可以大大提高服务的并发。
服务的异常定位:
自动化部署:Jenkins——docker——k8s——RANCHER 持续集成
微服务:
总结:
单体架构:简单方便、高度耦合、扩展性差、适合小项目
分布式架构:松耦合,扩展性好,但是架构复杂,难度大。适合大型互联网项目
微服务:一种良好的分布式架构方案
Dubbo的核心是 服务远程调用,专门定义了 Dubbo协议(出的比较早,不是一套完整的微服务结构,非常不完善)
SpringCloud是整合,集大成者,直接采用了基于http的协议。提供了专门的配置中心和网关(SpringCloudGateway 比较受欢迎,原因是支持了响应式编程),Hystrix 功能也十分强大。
SpringCloudAlibaba,实现了SpringCloud得到标准接口。(甚至兼容Nacos、Eureka、Dubbo、Feign),Nacos同时支持 Dubbo和Feign两种架构
企业的排列组合:
大多数都是从其他公司整合的
在Java里发送HTTP请求:
首先在 Springboot启动类配置bean
/**
* 创建RestTemplate对象,交给Spring容器管理
* @return
*/
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
自动装配
@Autowired
private RestTemplate restTemplate;
完善service
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
// 2. 利用 RestTemplate 调用 user-service 的接口,查询用户信息
String url = "http://localhost:8081/user/" + order.getUserId();
User forObject = restTemplate.getForObject(url, User.class);
order.setUser(forObject);
// 4.返回
return order;
}
提供者:暴露接口给其它微服务调用服务
消费者:调用其它微服务提供的接口
提供者与消费者角色其实是相对的
消费者该如何获取服务提供者具体信息?
如果有多个服务提供者,消费者该如何选择?
消费者如何感知服务提供者健康状态?
新建模块,取名 euraka-server
添加pom.xml
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
dependency>
新建启动类
package cn.itcast.eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
新建配置文件 application.yml
server:
port: 10086 # 服务端口
spring:
application:
name: eureka-server # eureka的服务名称
eureka:
client:
service-url:
defaultZone: http://localhost:10086/eureka/ # 服务地址
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
spring:
application:
name: order-service # eureka的服务名称
eureka:
client:
service-url:
defaultZone: http://localhost:10086/eureka/ # 服务地址
多开实例:
增加vm options:
-Dserver.port=8032
@LoadBalanced
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
// 2. 利用 RestTemplate 调用 user-service 的接口,查询用户信息
String url = "http://user-service/user/" + order.getUserId();
User forObject = restTemplate.getForObject(url, User.class);
order.setUser(forObject);
// 4.返回
return order;
}
@Bean
public IRule randomRule() {
return new RandomRule();
}
user-service:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
ribbon:
eager-load:
enabled: true # 开启饥饿加载
clients: # 指定要开启饥饿加载的服务名称
- user-service
在Nacos的GitHub页面,提供有下载链接,可以下载编译好的Nacos服务端或者源代码:
GitHub主页:https://github.com/alibaba/nacos
GitHub的Release下载页:https://github.com/alibaba/nacos/releases
startup.cmd -m standalone
在cloud-demo父工程添加依赖
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-alibaba-dependenciesartifactId>
<version>2.2.5.RELEASEversion>
<type>pomtype>
<scope>importscope>
dependency>
注释掉之前的 eureka 依赖
客户端依赖:
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
spring:
cloud:
nacos:
server-addr: locahost:8848
默认用户名/密码为: nacos/nacos
服务集群属性
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: HZ
把 User1, User2,Order分配到HZ,User3 SH。
然后Order在远程调用User的时候,优先选择本地集群(即User1, User2)
修改 Order的配置:
user-service:
ribbon:
# NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
配置,在具体服务里application.yml 添加配置:
spring:
cloud:
nacos:
discovery:
namespace: c3b1bbc3-0ebd-4298-92c2-1e54858acf02
此时,两个namespace的服务就已经阴阳两隔了。
总结:
spring:
cloud:
nacos:
discovery:
ephemeral: false # 是否为临时实例