SpringCloud

微服务简介

将一些微小的服务单独抽离出来组成一个个微小的服务,一个服务只对应一个功能,只做单一的功能,并且独立部署运行。微服务使用rest和rpc进行通信。

微服务是一种分布式架构,指的是非常微小的服务,更细粒度的拆分,通常指的是不能再拆的服务。微服务更强调服务的专业化和精细分工。

微服务优势

开发相对比较简单,毕竟把项目抽成很多个微小的服务,服务中有多种类型的服务,比如偏向业务的就使用java,算法类的使用python,对性能要求高的场景就用c,c++、。

微服务的挑战

在java领域最大解决微服务的问题的方法就是springcloud,springcloud包含了很多工具能够帮助我们解决很多问题,springcloud是分布式微服务架构的一站式解决方案。

springcloud是一个大组件的集合,提供了很多功能和方法来解决分布式的问题,比如有的第三方库和插件比较好,springcloud就会加入其中,帮助开发者更好的去开发

springcloud中spring cloud netfilx 认为是比较官方流行的组件,实现了springcloud。

Springcloud alibaba

springcloud alibaba在国内各大公司非常流行,致力于提供微服务的一站式的解决方案,只需要提供一些注解,就能提供阿里的分布式服务。

这里可以看到springcloudalibab实现的组件。

cloud解决问题:

restTemplate

restTemplate是从spring3.0提出的一个http请求工具,是一个同步的rest api客户端,提供了常见的rest(资源状态转移)请求模板。

比如网络上的数据图片视频文本都是资源,状态转移就是对资源进行增删改查等等操作,实际上rest描述的就是网络上客户端和服务器之间进行交互。

restful

REST 是一种软件架构风格,它定义了一组设计原则和约束条件,用于创建高效、可扩展且易于维护的 Web 服务。RESTful Web 服务就是遵循这些原则的 Web 服务,它使用 HTTP 协议的标准方法(如 GET、POST、PUT、DELETE)来实现资源的创建、读取、更新和删除操作(CRUD)

核心原则

  • 资源标识 :每个资源都有一个唯一的标识符,通常是一个 URL。例如,一个用户资源可以用http://example.com/api/users/1来表示,其中1是用户的 ID。
  • 统一接口 :使用标准的 HTTP 方法来操作资源,具体如下:
    • GET:用于获取资源。
    • POST:用于创建新资源。
    • PUT:用于更新现有资源。
    • DELETE:用于删除资源。

resttemplate是实现了restful风格的,是一种http请求,他会处理http的链接和关闭。

实际上企业中并没有使用restful的场景,因为restful存在很多问题。比如url写死的问题等等。

Eureka

服务提供者:被其他微服务调用的服务,提供接口给其他服务。

服务消费者:一次业务中,调用其他微服务的服务,调用其他微服务的接口。

服务注册中心:用于保存服务提供者,当提供者发生url变更等,就会通知服务注册中心。

服务注册:服务提供者在启动的时候,向注册中心注册自身服务,并且定期发送心跳包。

cap理论:

一致性:

这里的一致性指的是强一致性,主库和从库不管什么时候对外提供的服务都是一致的。就是主库比如修改数据后会及时同步到从库中。

可用性:

对所有的请求都有响应即使这个响应可能是错误的。

分区容错性:

在网络分区下,系统依然可以提供对外服务。

搭建eureka

服务注册:

加入eureka的依赖,修改配置信息,重启服务。

服务发现:

加入eureka的依赖,修改配置信息,修改远程调用的代码。

复制代码
<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>

eureka:
  instance:
    hostname: localhost #主机名称
  client:
    fetch-registry: false # 表示是否从Eureka Server获取注册信息,默认为true.因为这是一个单点的Eureka Server,不需要同步其他的Eureka Server节点的数据,这里设置为false
    register-with-eureka: false # 表示是否将自己注册到Eureka Server,默认为true.由于当前应用就是Eureka Server,故而设置为false.
    service-url:
      # 设置与Eureka Server的地址,查询服务和注册服务都需要依赖这个地址
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

public OrderInfo selectOrderById(Integer orderId){
        OrderInfo orderInfo = orderMapper.selectOrderById(orderId);
        List<ServiceInstance> instances = discoveryClient.getInstances("product-server");
        String uri = instances.get(0).getUri().toString();

        /*String url="http://127.0.0.1:9090/product/"+orderInfo.getProductId();*/
        String url=uri+"/product/"+orderInfo.getProductId();
        ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);
        orderInfo.setProductInfo(productInfo);

        return orderInfo;



    }

eureka和zookeeper的区别

  1. Eureka是Netflix开源的项⽬, ⽽Zookeeper是Apache开源的项⽬.
  2. Eureka 基于AP原则, 保证⾼可⽤, Zookeeper基于CP原则, 保证数据⼀致性
  3. Eureka 每个节点 都是均等的, Zookeeper的节点区分Leader 和Follower 或 Observer, 也正因为这个原因, 如果Zookeeper的Leader发⽣故障时, 需要重新选举, 选举过程集群会有短暂时间的不可用。

负载均衡

一个实例常常都是多级部署,可以保障可用性

在service中复制一份一模一样的,并且在vm option中配置端口号。

这时候就看到eureka中启动了我们的多个服务。

负载均衡,简称lb,为高并发,高可用系统必不可少的组件,当服务流量增大的时候。通常会增加机器,负载均衡就是在这多个机器之间进行合理的系统分配。一般会给配置比较好的机器分配更多的负载。

springcloudloadbalancer

在定义的resttemplate上面加上loadbalanced,并且修改服务端代码

复制代码
public OrderInfo selectOrderById(Integer orderId){
        OrderInfo orderInfo = orderMapper.selectOrderById(orderId);


        String url="http://product-server/product/"+orderInfo.getProductId();
        log.info("远程调用"+url);
        ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);
        orderInfo.setProductInfo(productInfo);

        return orderInfo;



    }

当我们运行程序,进行访问的时候就可以看到对应已经发生了负载均衡。我们的springcloud是按照一定的顺序进行负载分配。

  1. 轮询策略:服务器轮流的去进行处理,比如第一次A处理,第二次B处理,第三次C处理。
  2. 随机策略:随机选择一个后端的服务器进行。

但是实际上可以自己自定义负载均衡的策略,通过以下配置,配置好想要执行策略的微服务和具体执行的方法是什么。

复制代码
public class CustomLoadBalancerConfiguration {

	@Bean
	ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,
			LoadBalancerClientFactory loadBalancerClientFactory) {
		String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
		return new RandomLoadBalancer(loadBalancerClientFactory
				.getLazyProvider(name, ServiceInstanceListSupplier.class),
				name);
	}
}

@LoadBalancerClient(name = "product-server",configuration = CustomLoadBalancerConfiguration.class)

这样就可以实现负载均衡策略了,当我们发送信息的时候,后端就会根据不同的策略对信息进行分发。

打包配置

复制代码
spring:
  profiles:
    active: @profile.name@

在主yml中配置以上信息,

复制代码
server:
  port: 8080

spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/cloud_order?characterEncoding=utf8&useSSL=false
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
  application:
    name: order-service

mybatis:
  #mapper-locations: classpath:mapper/*Mapper.xml
  configuration: # 配置打印 MyBatis 执行的 SQL
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    map-underscore-to-camel-case: true  #自动驼峰转换

#Eureka Client
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10010/eureka/

接着在另外两个yml中配置其他环境,这样就可以以不同的方式打包了。

选择哪个,哪个就会被打包。

相关推荐
珹洺13 分钟前
计算机网络:(二)计算机网络在我国发展与网络类别与性能 (附带图谱更好对比理解)
运维·服务器·网络·数据库·后端·计算机网络
Pandaconda14 分钟前
【后端开发面试题】每日 3 题(十三)
redis·分布式·后端·面试·kafka·后端开发·缓存消息队列
ivygeek20 分钟前
MCP:基于Java SDK 实现一个 Mcp Server
后端·mcp
这里有鱼汤25 分钟前
解决Python路径问题:为什么你应该用 pathlib 替代 os.path
后端·python
Victor35625 分钟前
Dubbo(1)什么是Dubbo?
后端
程序员清风25 分钟前
谈谈Select For Update的实现原理?
数据库·后端·面试
helloworld_工程师31 分钟前
20分钟上手DeepSeek开发:SpringBoot + Vue2快速构建AI对话系统
java·后端·deepseek
山海不说话34 分钟前
从零搭建微服务项目Pro(第6-1章——Spring Security+JWT实现用户鉴权访问与token刷新)
spring boot·后端·spring·spring cloud·微服务·架构
GeekAGI1 小时前
Gunicorn 返回 502 问题解析
后端
Rinai1 小时前
Redis,从数据结构到集群实践的知识总结
redis·后端