Springcloud基础运用流程

Springcloud基础运用流程

1. 新建一个springboot工程

  • 父工程不需要src文件夹
  • 需要注意点:
  • 一、spirngboot,springcloud和springcloudalibaba之间的版本确定
  • 二、父工程只做依赖管理,也就是只有版本管理,depenencymanagement
  • 三、springcloudalibaba是springcloud的子项目,依赖于springcloud

2. 创建服务提供者

  • 明确思想:springcloud微服务架构中,每一个模块通过业务拆分,都是可以独立运行的,原来的单体结构的内部调用关系不成立,而模块之间仍然需要调用,也就是通讯,所以每个模块都需要提供一个接口来供其他模块调用访问
  • pom.xml文件配置
<!--  微服务基础依赖  -->
    <dependencies>
        <!--   web的场景依赖     -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--  端点监控场景依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <!--   服务注册与发现的场景依赖     -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <dependency>
            <groupId>com.qf</groupId>
            <artifactId>cloud-entity</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
    </dependencies>
  • application.yml配置文件

需要指定:

  1. 服务的名称(application.name),一般来说与模块的名称一致即可
  2. 服务的端口号
  3. 注册的地址,即nacos的地址,连接nacos的用户名和密码,默认都是nacos
# 配置服务名称 ,一般与模块名一致
spring:
  application:
    name: cloud-goods
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        username: nacos
        password: nacos

#设置端口
server:
  port: 9001
  • 引导类上需要增加注解@EnableDiscoveryClient
@SpringBootApplication
@EnableDiscoveryClient
public class CloudGoodsApplication {

    public static void main(String[] args) {
        SpringApplication.run(CloudGoodsApplication.class, args);
    }

}

站在nacos的立场上,每一个模块都需要向nacos注册和被其他模块发现,所以此注解意味着每一个模块都是nacos的客户端,而nacos作为服务端

  • controller中提供接口
@RestController
@RequestMapping("goods")
public class GoodsController {

    @RequestMapping("info/{id}")
    public Goods info(@PathVariable Integer id) {
        return new Goods(id,"小米");
    }
}

controller层写法与之前一致,模块内部依然可以调用自己的service和dao层,在作为消费者时需要其他工具帮助模块间的通信,调用

3. 创建服务的消费者

  • 明确思想: 所谓的服务的消费者就是调用nacos中已经注册过的服务的使用者,就如同之前单体结构中的controller层调用service层一样,只是换了一种形式,使用http协议借用第三方nacos来调用服务
  • pom.xml配置(依赖:父工程——springboot,web起步依赖,springcloudalibaba中nacos的注册与发现,端点监控actuator)
<dependencies>
        <!-- 每一个微服务都是一个独立的进程,需要提供接口http访问 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- 端点监控 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <!-- 服务注册与发现 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <dependency>
            <groupId>com.qf</groupId>
            <artifactId>cloud-entity</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
  • application.yml文件配置(与服务提供者相同)
# 配置服务模块名称
server:
  port: 9002
spring:
  application:
    name: cloud-order
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        username: nacos
        password: nacos

  • 引导类上增加注解@EnableDiscoveryClient(每一个springcloud的消费和提供服务类都需要加此注解)
@SpringBootApplication
@EnableDiscoveryClient
public class CloudOrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(CloudOrderApplication.class, args);
    }

    @Bean
    //让ribbon拦截RestTemplate发出的所有的请求
    //ribbon获取url中的service name
    //从 nacos 注册中心获取实例列表
    //负责从实例列表中通过相应的负载均衡算法,获取一个实例
    //RestTemplate请求实例
    @LoadBalanced
    public RestTemplate initRestTemplate(){
        return new RestTemplate();
    }
}

注意:

springcloud中的服务消费者中需要调用其他服务,就需要服务间通信,需要在引导类中配置RestTemplate来作为服务间通信的媒介

@LoadBalance表明通过负载均衡策略来获取实例

  • 服务消费者的controller层
@RestController
@RequestMapping("order")
public class OrderController {

    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping("save")
    public Map save() {
        // 需要请求服务提供者的地址,不能硬编码,写成服务名
        String url = "http://cloud-goods/goods/info/1";
        //利用restTemplate发送请求
        Goods goods = restTemplate.getForObject(url, Goods.class);

        //ResponseEntity<Goods> forEntity = restTemplate.getForEntity(url, Goods.class);

        System.out.println(goods);

        // service层操作

        return new HashMap(){{
            put("code",200);
            put("msg","success");
        }};
    }
}

注意点:

  1. url路径一定不能硬编码,要通过服务名来指定调用的服务
  2. 调用需要注入restTemplate对象,使用该对象来调用服务
  3. restTemplate的getForObject() 方法获取的是响应结果而getForEntity() 获得的是响应体
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值