一:系统架构演变
1.集中式架构:
各种模块都放在一起,并发高,耦合代码
2…垂直拆分:
解决并发流量分担,不同模块进行优化,系统相互独立重复开发,影响效率
3.分布式服务:
提高了代码复用,互相之间调用太多关系错综复杂,难以维护
4.微服务:
相对分布式优势就是有模块之间的管理–eureka注册中心
①:单一职责–就是不同模块不同功能
②:独立–五脏俱全(有各自的功能表现层–业务层–持久层–数据库以及cache)
③:面向服务:提供rest风格服务接口API(基于http协议)
④:自治:
a.团队独立
b.技术独立
c.前后端分离
d.数据库分离
e.部署独立
二.服务调用方式(远程调用)
1:RPC(dubbo)–只支持java,不能跨语言
2:http(支持各种语言)
①:HttpClient
②:OKHttp
③:URLConnection
④:Spring的RestTemplate(对上面3种进行再次封装可以使用远程调用)
三:SpringCloud(5大核心组件)
1 Eureka:注册中心 --> consul , zookeeper (服务管理)
2.Zuul:服务网关 --> spring cloud gateway
3.Ribbon:负载均衡–>对于集群调用策略
4. Feign:服务调用–>远程调用
5. Hystix:熔断器–>保护机制
四:Eureka(注册中心)
1.基础架构
① Eureka-Server:就是服务注册中心(可以是一个集群),对外暴露自己的地址。
②. 提供者:启动后向Eureka注册自己信息(地址,服务名称等),并且定期进行服务续约
③. 消费者:服务调用方,会定期去Eureka拉取服务列表,然后使用负载均衡算法选出一个服务进行调用。
④. 心跳(续约):提供者定期通过http方式向Eureka刷新自己的状态
2.编写EurekaServer
①:引依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
②:编写启动类(加注解)
@SpringBootApplication
@EnableEurekaServer // **声明这个应用是一个EurekaServer**
public class EurekaServer {
public static void main(String[] args) {
SpringApplication.run(EurekaServer.class, args);
}
}
③:编写配置
server:
port: 10086
spring:
application:
name: eureka-server # 应用名称,会在Eureka中作为服务的id标识(serviceId)
eureka:
client:
service-url: # EurekaServer的地址,现在是自己的地址,如果是集群,需要写其它Server的地址。(高可用)
defaultZone: http://127.0.0.1:10086/eureka #将该IP注册到eureka上的意思
register-with-eureka: false # 不注册自己
fetch-registry: false #不拉取服务
启动服务,并访问:http://127.0.0.1:10086
3.服务注册
①:引入依赖
<!-- Eureka客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
②:在启动类上开启Eureka客户端功能
@SpringBootApplication
@MapperScan("cn.itcast.user.mapper")
@EnableDiscoveryClient // 开启Eureka客户端发现功能
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceDemoApplication.class, args);
}
}
③:编写配置
server:
port: 8081
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb01
username: root
password: 123
application:
name: user-service # 应用名称
eureka:
client:
service-url: # EurekaServer地址
defaultZone: http://127.0.0.1:10086/eureka
4.服务发现
①:引入依赖
<!-- Eureka客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
②:在启动类开启Eureka客户端
@SpringBootApplication
@EnableDiscoveryClient // 开启Eureka客户端
public class ConsumerApplication {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
③:修改配置
server:
port: 8080
spring:
application:
name: consumer # 应用名称
eureka:
client:
service-url: # EurekaServer地址
defaultZone: http://127.0.0.1:10086/eureka
5.实例:
手动获取erueka中服务名以及下面的实例,进行远程调用代码
@RestController
@RequestMapping("consumer")
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("{id}")
public User queryById(@PathVariable("id") Long id){
// 根据服务id(spring.application.name),获取服务实例列表
List<ServiceInstance> instances = discoveryClient.getInstances("user-service");
// 取出一个服务实例
ServiceInstance instance = instances.get(0);
// 从实例中获取host和port,组成url
String url = String.format("http://%s:%s/user/%s", instance.getHost(), instance.getPort(), id);
// 查询
User user = restTemplate.getForObject(url, User.class);
return user;
}
}
6.高可用集群:
①:不同服务eurekaSever之间互相注册
②:客户端注册服务到集群
eureka:
client:
service-url: # EurekaServer地址,多个地址以','隔开
defaultZone: http://127.0.0.1:10086/eureka,http://127.0.0.1:10087/eureka
注意:理解重要
①.多个Eureka Server之间也会互相注册为服务,当服务提供者注册到Eureka Server集群中的某个节点时,该节点会把服务的信息同步给集群中的每个节点,从而实现高可用集群。
因此,无论客户端访问到Eureka Server集群中的任意一个节点,都可以获取到完整的服务列表信息。(不管拉取那个服务都可以获取所有的注册服务信息)
②:客户端注册服务到集群(防止任何一个Eureka Server挂了,就可以拉取其他没挂的服务)
7.Eureka客户端
①:服务注册
②:服务续约
③:获取服务列表
8.服务下线、失效剔除和自我保护
①:
②:
③:
总结:
- 服务的注册和发现都是可控制的,可以关闭也可以开启。默认都是开启
- 注册后需要心跳,心跳周期默认30秒一次,超过90秒没法认为宕机
- 服务拉取默认30秒拉取一次
- Eureka每个60秒会剔除标记为宕机的服务
- Eureka会有自我保护,当心跳失败比例超过阈值,那么开启自我保护,不再剔除服务。
- Eureka高可用就是多台Eureka互相注册在对方上