服务调用

服务发现

image-oZLN.png

如何获取到提供方的 协议+ip+端口 ?

硬编码方式,不够灵活,带来配置困难,无法应对ip地址变化的问题。

image-rTWb.png

基础案例

  1. 下载
  2. 解压
  3. 修改配置
nacos.core.auth.server.identity.key=nacos
nacos.core.auth.server.identity.value=nacosnacos.core.auth.plugin.nacos.token.secret.key=6YeN5bqG5aSP5aSp55yf55qE5YeJ5b+r77yM5Y+q5pyJNDDluqbvvIHlpKflrrbpg73mmK/nhp/kurrjgILng63vvIHvvIHvvIHph43luoblpI/lpKnnnJ/nmoTlh4nlv6vvvIzlj6rmnIk0MOW6pu+8geWkp+WutumDveaYr+eGn+S6uuOAgueDre+8ge+8ge+8gQ==
  1. 启动

    1. bin,打开cmd
    2. startup.cmd -m standalone
  2. 访问 http://localhost:8080/

    1. 初始化密码,nacos/nacos
    2. 登录

新建提供方

  1. 新建项目(spring-boot) http://start.aliyun.com

    image-rlkn.png

  2. 提供可以被调用的接口

  3. 集成nacos

    spring:
    application:
    name: user  #服务名
    cloud:
    nacos:
    discovery:
    server-addr: 127.0.0.1:8848  #nacos注册中心地址
    username: nacos
    password: nacos
    server:
    port: 9001
    
  4. 启动,测试

新建调用方

  1. 创建项目同提供方
  2. 编写服务发现和调用的代码
    1. 声明RestTemplate

    2. 注入DiscoveryClient和RestTemplate,调用

      image-OUJo.png

负载均衡

image-jgAA.png

spring-cloud-loadbalancer

  1. 调用方添加依赖

        <spring-cloud.version>2025.0.3</spring-cloud.version>
    
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>
    
       <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    
  2. 调用方改写代码

    image-tcjD.png

  3. 提供方定义多环境配置文件

    image-TeIH.png

  4. 打包提供者,mvn clean package (跳过测试)

    image-yEOW.png

  5. 控制台启动3个实例 java -jar .\user-0.0.1-SNAPSHOT.jar --spring.profiles.active=config0

  6. 发送请求,测试结果

服务调用

声明式服务调用 openfeign

  1. 加依赖
 <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

image-HdVV.png

openfeign实现原理

  • 最核心技术: 动态代理 + 反射

  • 启动时包扫描,扫描到所有的feignClient

  • 动态代理,生成实现类实现接口

    • 实现接口,需要用反射获取到响应的信息,实现服务调用
  • 创建代理类的实例,注入到spring的容器中

    image-uwuj.png

    image-YiSU.png