微服务------环境搭建和创建工程

模拟场景:电商项目中的商品微服务订单微服务为案例

1. 准备

1.1 模块设计

test01-parent 父工程 ------jar的版本管理

test01-common 公共模块(实体类){实体类,公共依赖,工具类}

test01-product 商品微服务 

test01-order 订单微服务

 1.2 微服务的调用

在微服务架构中,最常见的场景就是微服务之间的相互调用。我们以电商系统中常见的用户下单

例来演示微服务的调用:客户向订单微服务发起一个下单的请求,在进行保存订单之前需要调用商品微服务查询商品的信息。

我们一般把服务的主动调用方称为服务消费者,把服务的被调用方称为服务提供者

2. 创建工程

 2.1 test01-parent 父工程 ------jar的版本管理

第一步:新建springboot工程,且不添加任何依赖

第二步: 在pom.xml中设置jar的版本

<!--dependencyManagement:它只负责jar的版本号管理,不负责jar的下载,交于子模块,子模块在使用时无需指定版本号
         :springboot springcloud  springcloudalibaba之间版本一定要匹配
   -->
    <dependencyManagement>
        <dependencies>
            <!--springcloud的版本管理-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--springcloudalibaba的版本管理-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

2.2 test01-common 公共模块(实体类){实体类,公共依赖,工具类}

第一步:在父工程中新建maven工程,名字命名为test01-common

 

 第二部:添加公共实体的对象、依赖、工具类

<dependencies>
    <!--        将数据转换为JSON,在转换为相应的实体对象-->
    <dependency>
        <groupId>net.sf.json-lib</groupId>
        <artifactId>json-lib</artifactId>
        <version>2.4</version>
        <classifier>jdk15</classifier>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.5.2</version>
    </dependency>
</dependencies>

 工具类:

package com.sal.until;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @Author bian
 * @Date 2022/6/10 19:57
 * @PackageName:com.sal.until
 * @ClassName: CommonResult
 * @Description: TODO
 * @Version 1.0
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class CommonResult {
    private Integer code;
    private String msg;
    private Object data;
}

实体类:

package com.sal.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

@Data
@TableName("shop_order")
public class Order {
    @TableId(type = IdType.AUTO)
    private Long oid; //订单id
    private Integer uid;//用户id
    private String username;//用户名
    private Integer pid;//商品id
    private String pname;//商品名称
    private Double pprice;//商品价格
    private Integer number;//购买数量
}
package com.sal.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

@Data
@TableName(value="shop_product")
public class Product {
    @TableId(type= IdType.AUTO)
    private Integer pid;
    private String pname;//商品名称
    private Double pprice;//商品价格
    private Integer stock;//库存
}

2.3 test01-product  商品微服务

第一步:添加依赖

<dependencies>
        <!--        nacos:在配置中心获取配置信息-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!--        引入alibaba的nacos作为注册中心进行收集服务信息-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--        引入公共部分-->
        <dependency>
            <groupId>com.sal</groupId>
            <artifactId>test01-common</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

        <!--        用于启动-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
    </dependencies>

第二步:编写代码和启动类

controller:

package com.sal.controller;

import com.sal.server.ProductService;
import com.sal.until.CommonResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Author bian
 * @Date 2022/8/18 19:45
 * @PackageName:com.sal.controller
 * @ClassName: ProductController
 * @Description: TODO
 * @Version 1.0
 */
@RestController
@RequestMapping("product")
public class ProductController {

    @Autowired
    private ProductService productService;

    @GetMapping("selects/{ids}")
    public CommonResult selects(@PathVariable Integer ids){
        return productService.selectByids(ids);
    }

}

server:

package com.sal.server;


import com.sal.until.CommonResult;

/**
 * @Author bian
 * @Date 2022/8/18 19:43
 * @PackageName:com.sal.server.impl
 * @ClassName: ProductService
 * @Description: TODO
 * @Version 1.0
 */
public interface ProductService {
    CommonResult selectByids(Integer ids);
}

server--》impl

package com.sal.server.impl;

import com.sal.dao.ProductMapper;
import com.sal.entity.Product;
import com.sal.server.ProductService;
import com.sal.until.CommonResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @Author bian
 * @Date 2022/8/18 19:43
 * @PackageName:com.sal.server.impl
 * @ClassName: ProductServiceImpl
 * @Description: TODO
 * @Version 1.0
 */
@Service
public class ProductServiceImpl implements ProductService {

    @Autowired
    private ProductMapper productMapper;

    @Override
    public CommonResult selectByids(Integer ids) {
        Product product = productMapper.selectById(ids);
        if(product!=null){
            return new CommonResult(2000,"查询成功",product);
        }
        return new CommonResult(5000,"查询失败",null);
    }
}

dao:

package com.sal.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sal.entity.Product;
import org.apache.ibatis.annotations.Mapper;

/**
 * @Author bian
 * @Date 2022/8/18 19:40
 * @PackageName:com.sal.dao
 * @ClassName: ProductMapper
 * @Description: TODO
 * @Version 1.0
 */
@Mapper
public interface ProductMapper extends BaseMapper<Product> {
}

启动类:

package com.sal;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @Author bian
 * @Date 2022/8/18 18:07
 * @PackageName:com.sal.produce
 * @ClassName: ProductApp
 * @Description: TODO
 * @Version 1.0
 */
//启动类
@SpringBootApplication
public class ProductApp {
    public static void main(String[] args) {
        SpringApplication.run(ProductApp.class,args);
    }
}

bootstrap.properties:

需要将服务的注册放到注册中心去,这样在可以便于获取服务之间的信息,例如:可以在服务上拉取所要调用的服务的接口、服务名,从而获取该服务所实现的功能。

#为了以后配置集群,设定接口为8080~~8099之间
server.port=8081

#sql配置
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/springcould?serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123456

#sql日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl


#指定微服务名称
spring.application.name=product

#指定服务中心接口  默认接口是8848 我这是后面配置的负载均衡配置了两个备用接口
spring.cloud.nacos.discovery.server-addr=localhost:82

2.4 test01-order  订单微服务

第一步:加载依赖

<dependencies>
        <!--        获取配置信息-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!--        openfeign依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--        引入公共部分-->
        <dependency>
            <groupId>com.sal</groupId>
            <artifactId>test01-common</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

        <!--        用于启动-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
    </dependencies>

第二步:编写代码和启动类

controller:

OrderController:

使用restTemplate获取别的服务中的信息

package com.order.controller;

import com.order.service.OrderService;
import com.sal.entity.Order;
import com.sal.entity.Product;
import com.sal.until.CommonResult;
import net.sf.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.net.URI;
import java.util.List;
import java.util.Map;
import java.util.Random;

/**
 * @Author bian
 * @Date 2022/8/18 20:04
 * @PackageName:com.order.controller
 * @ClassName: OrderController
 * @Description: TODO
 * @Version 1.0
 */
@RestController
@RequestMapping("order")
public class OrderController {

    @Autowired
    private OrderService orderService;

//  spring提供的一个工具类,该类可以从注册中心获取微服务信息
    @Autowired
    private DiscoveryClient discoveryClient;

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("inserts/{pid}/{num}")
    public String inserts(@PathVariable Integer pid,@PathVariable Integer num){
        Order order = new Order();
        order.setNumber(num);
        //用户的信息可以根据token从redis中获取用户信息
        order.setUid(1);
        order.setUsername("张三");

        //需要设置订单对象中商品的信息
        //商品操作都在商品微服务---订单微服务远程调用商品微服务即可拿到商品信息。
        // 远程调用:http协议的restFul风格调用适合微服务,基于TCP协议的RPC调用适合SOA分布式
        //一定采用的为http协议:
        //(1)自己写代码完成http调用【httpclient】微信支付 ---适合调用第三方网址。
        //(2)spring提高了一个工具类RestTemplate,该类也是基于http协议完成的调用

        //因为查询的信息返回的是CommonResult的数据,因此接的话要接与之对应的数据

//      根据服务名获取对应的所有实例对象
        List<ServiceInstance> product = discoveryClient.getInstances("product");
//      获取第一个实例对象
//        ServiceInstance serviceInstance = product.get(0);
//      负载均衡:(实例对象不止一个)
//      获取实例对象(随机获取)
//      获取指定范围的随机数:Math.random*product.size() -->返回的是double数据,需要转为int    或者  new Random().nextInt(product.size())  -->直接用
        ServiceInstance serviceInstance = product.get(new Random().nextInt(product.size()));
        System.out.println("serviceInstance:"+serviceInstance.toString());
//      获取端口号
        int port = serviceInstance.getPort();
        System.out.println("port:"+port);
//      获取ip地址
        String host = serviceInstance.getHost();
        System.out.println("host:"+host);
//      null
        String instanceId = serviceInstance.getInstanceId();
        System.out.println("instanceId:"+instanceId);
//      获取服务名称
        String serviceId = serviceInstance.getServiceId();
        System.out.println("serviceId:"+serviceId);
//      获取服务信息
        /*
            metadata:{nacos.instanceId=192.168.137.1#8081#DEFAULT#DEFAULT_GROUP@@product,
            nacos.weight=1.0, nacos.cluster=DEFAULT, nacos.ephemeral=true,
            nacos.healthy=true, preserved.register.source=SPRING_CLOUD}
         */
        Map<String, String> metadata = serviceInstance.getMetadata();
        System.out.println("metadata:"+metadata);
//      null
        String scheme = serviceInstance.getScheme();
        System.out.println("scheme:"+scheme);
//      http://192.168.137.1:8081  -->获取的信息
        URI uri = serviceInstance.getUri();
        System.out.println("uri:"+uri);
//      获取实例对象的http+ip+port
//      http://192.168.137.1:8081  -->获取的信息,以string类型
        String s = uri.toString();
        System.out.println("s:"+s);

        CommonResult forObject = restTemplate.getForObject(s+"/product/selects/" + pid, CommonResult.class);
        System.out.println("product:"+forObject);

        //返回的数据都在data中存放着,需要获取出来
        Object data = forObject.getData();
        //将Object数据转换成JSON数据
        JSONObject jsonObject = JSONObject.fromObject(forObject.getData());
        //在将JSON数据转换成Product类型的数据
        Product o = (Product) jsonObject.toBean(jsonObject, Product.class);

        order.setPid(o.getPid());
        order.setPname(o.getPname());
        order.setPprice(o.getPprice());

        int inserts = orderService.inserts(order);
        if(inserts!=0){
            return "下单成功";
        }
        return "下单失败";
    }

}

OrderController01:

根据服务名发送服务请求获取信息

package com.order.controller;

import com.order.service.OrderService;
import com.sal.entity.Order;
import com.sal.entity.Product;
import com.sal.until.CommonResult;
import net.sf.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.net.URI;
import java.util.List;
import java.util.Map;
import java.util.Random;

/**
 * @Author bian
 * @Date 2022/8/18 20:04
 * @PackageName:com.order.controller
 * @ClassName: OrderController
 * @Description: TODO
 * @Version 1.0
 */
@RestController
@RequestMapping("order")
public class OrderController01 {

    @Autowired
    private OrderService orderService;

//  spring提供的一个工具类,该类可以从注册中心获取微服务信息
    @Autowired
    private DiscoveryClient discoveryClient;

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("inserts/{pid}/{num}")
    public String inserts(@PathVariable Integer pid,@PathVariable Integer num){
        Order order = new Order();
        order.setNumber(num);
        //用户的信息可以根据token从redis中获取用户信息
        order.setUid(1);
        order.setUsername("张三");

        //需要设置订单对象中商品的信息
        //商品操作都在商品微服务---订单微服务远程调用商品微服务即可拿到商品信息。
        // 远程调用:http协议的restFul风格调用适合微服务,基于TCP协议的RPC调用适合SOA分布式
        //一定采用的为http协议:
        //(1)自己写代码完成http调用【httpclient】微信支付 ---适合调用第三方网址。
        //(2)spring提高了一个工具类RestTemplate,该类也是基于http协议完成的调用

        //因为查询的信息返回的是CommonResult的数据,因此接的话要接与之对应的数据

//      根据服务名获取对应的所有实例对象
        List<ServiceInstance> product = discoveryClient.getInstances("product");
//      获取第一个实例对象
//        ServiceInstance serviceInstance = product.get(0);
//      负载均衡:(实例对象不止一个)
//      获取实例对象(随机获取)
//      获取指定范围的随机数:Math.random*product.size() -->返回的是double数据,需要转为int    或者  new Random().nextInt(product.size())  -->直接用
        ServiceInstance serviceInstance = product.get(new Random().nextInt(product.size()));
        System.out.println("serviceInstance:"+serviceInstance.toString());
//      获取端口号
        int port = serviceInstance.getPort();
        System.out.println("port:"+port);
//      获取ip地址
        String host = serviceInstance.getHost();
        System.out.println("host:"+host);
//      null
        String instanceId = serviceInstance.getInstanceId();
        System.out.println("instanceId:"+instanceId);
//      获取服务名称
        String serviceId = serviceInstance.getServiceId();
        System.out.println("serviceId:"+serviceId);
//      获取服务信息
        /*
            metadata:{nacos.instanceId=192.168.137.1#8081#DEFAULT#DEFAULT_GROUP@@product,
            nacos.weight=1.0, nacos.cluster=DEFAULT, nacos.ephemeral=true,
            nacos.healthy=true, preserved.register.source=SPRING_CLOUD}
         */
        Map<String, String> metadata = serviceInstance.getMetadata();
        System.out.println("metadata:"+metadata);
//      null
        String scheme = serviceInstance.getScheme();
        System.out.println("scheme:"+scheme);
//      http://192.168.137.1:8081  -->获取的信息
        URI uri = serviceInstance.getUri();
        System.out.println("uri:"+uri);
//      获取实例对象的http+ip+port
//      http://192.168.137.1:8081  -->获取的信息,以string类型
        String s = uri.toString();
//        System.out.println("s:"+s);

//      restTemplate调用必须 http://服务提供者的名称/服务提供资源路径   --> 默认使用的是轮询模式(一个一个的执行)
        CommonResult forObject = restTemplate.getForObject("http://product/product/selects/" + pid, CommonResult.class);
//      步骤:
        /*
            基于Ribbon实现负载均衡  --组件
                是Netflix发布的一个负载均衡器,在SpringCloud中,nacos一般配合着Ribbon使用,Ribbon提供了客户端给负载均衡的功能

             实现:
                1.在RestTemplate获取方法上的@LoadBalanced注解  使用Ribbon完成负载均衡
                2.修改RestTemplate调用代码  http://服务名称/资源路径
         */

        System.out.println("product:"+forObject);

        //返回的数据都在data中存放着,需要获取出来
        Object data = forObject.getData();
        //将Object数据转换成JSON数据
        JSONObject jsonObject = JSONObject.fromObject(forObject.getData());
        //在将JSON数据转换成Product类型的数据
        Product o = (Product) jsonObject.toBean(jsonObject, Product.class);

        order.setPid(o.getPid());
        order.setPname(o.getPname());
        order.setPprice(o.getPprice());

        int inserts = orderService.inserts(order);
        if(inserts!=0){
            return "下单成功";
        }
        return "下单失败";
    }

}

OrderController2:

之:ProductFeign:

package com.order.feign;

import com.sal.until.CommonResult;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

/**
 * @Author bian
 * @Date 2022/8/20 17:22
 * @PackageName:com.order.feign
 * @ClassName: ProductFeign
 * @Description: TODO
 * @Version 1.0
 */
@FeignClient(value = "product")
public interface ProductFeign {

    @GetMapping("product/selects/{ids}")
    CommonResult selects(@PathVariable Integer ids);

}

 从openfeign中调用服务获取所要获取信息的接口:

<!--        openfeign依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
package com.order.controller;

import com.order.feign.ProductFeign;
import com.order.service.OrderService;
import com.sal.entity.Order;
import com.sal.entity.Product;
import com.sal.until.CommonResult;
import net.sf.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

/**
 * @Author bian
 * @Date 2022/8/18 20:04
 * @PackageName:com.order.controller
 * @ClassName: OrderController
 * @Description: TODO
 * @Version 1.0
 */
@RestController
@RequestMapping("order")
//实时刷新读取配置 --》 读取的为自定义的配置信息,像端口一类的不可更改,只能改自己定义的属性,之后就会自动刷新重新获取自己定义的属性中的值
@RefreshScope
public class OrderController02 {

    @Autowired
    private OrderService orderService;

//  spring提供的一个工具类,该类可以从注册中心获取微服务信息
    @Autowired
    private DiscoveryClient discoveryClient;

    @Autowired
    private ProductFeign productFeign;

    @Autowired
    private RestTemplate restTemplate;

    @Value("${student.name}")
    private String name;

    @GetMapping("getOrder")
    public String getOrder(){
        return "姓名:"+name;
    }

    @GetMapping("inserts/{pid}/{num}")
    public String inserts(@PathVariable Integer pid,@PathVariable Integer num){
        Order order = new Order();
        order.setNumber(num);
        //用户的信息可以根据token从redis中获取用户信息
        order.setUid(1);
        order.setUsername("张三");

        //需要设置订单对象中商品的信息
        //商品操作都在商品微服务---订单微服务远程调用商品微服务即可拿到商品信息。
        // 远程调用:http协议的restFul风格调用适合微服务,基于TCP协议的RPC调用适合SOA分布式
        //一定采用的为http协议:
        //(1)自己写代码完成http调用【httpclient】微信支付 ---适合调用第三方网址。
        //(2)spring提高了一个工具类RestTemplate,该类也是基于http协议完成的调用

        //因为查询的信息返回的是CommonResult的数据,因此接的话要接与之对应的数据

//      根据服务名获取对应的所有实例对象
//        List<ServiceInstance> product = discoveryClient.getInstances("product");

//      获取第一个实例对象
//        ServiceInstance serviceInstance = product.get(0);
//      负载均衡:(实例对象不止一个)
//      获取实例对象(随机获取)
//      获取指定范围的随机数:Math.random*product.size() -->返回的是double数据,需要转为int    或者  new Random().nextInt(product.size())  -->直接用
//        ServiceInstance serviceInstance = product.get(new Random().nextInt(product.size()));
//        System.out.println("serviceInstance:"+serviceInstance.toString());
//      获取端口号
//        int port = serviceInstance.getPort();
//        System.out.println("port:"+port);
//      获取ip地址
//        String host = serviceInstance.getHost();
//        System.out.println("host:"+host);
//      null
//        String instanceId = serviceInstance.getInstanceId();
//        System.out.println("instanceId:"+instanceId);
//      获取服务名称
//        String serviceId = serviceInstance.getServiceId();
//        System.out.println("serviceId:"+serviceId);
//      获取服务信息
        /*
            metadata:{nacos.instanceId=192.168.137.1#8081#DEFAULT#DEFAULT_GROUP@@product,
            nacos.weight=1.0, nacos.cluster=DEFAULT, nacos.ephemeral=true,
            nacos.healthy=true, preserved.register.source=SPRING_CLOUD}
         */
//        Map<String, String> metadata = serviceInstance.getMetadata();
//        System.out.println("metadata:"+metadata);
//      null
//        String scheme = serviceInstance.getScheme();
//        System.out.println("scheme:"+scheme);
//      http://192.168.137.1:8081  -->获取的信息
//        URI uri = serviceInstance.getUri();
//        System.out.println("uri:"+uri);
//      获取实例对象的http+ip+port
//      http://192.168.137.1:8081  -->获取的信息,以string类型
//        String s = uri.toString();
//        System.out.println("s:"+s);

        CommonResult forObject = productFeign.selects(pid);

//      restTemplate调用必须 http://服务提供者的名称/服务提供资源路径   --> 默认使用的是轮询模式(一个一个的执行)
//        CommonResult forObject = restTemplate.getForObject("http://product/product/selects/" + pid, CommonResult.class);
//      步骤:
        /*
            基于Ribbon实现负载均衡  --组件
                是Netflix发布的一个负载均衡器,在SpringCloud中,nacos一般配合着Ribbon使用,Ribbon提供了客户端给负载均衡的功能

             实现:
                1.在RestTemplate获取方法上的@LoadBalanced注解  使用Ribbon完成负载均衡
                2.修改RestTemplate调用代码  http://服务名称/资源路径
         */

        System.out.println("product:"+forObject);

        //返回的数据都在data中存放着,需要获取出来
        Object data = forObject.getData();
        //将Object数据转换成JSON数据
        JSONObject jsonObject = JSONObject.fromObject(forObject.getData());
        //在将JSON数据转换成Product类型的数据
        Product o = (Product) jsonObject.toBean(jsonObject, Product.class);

        order.setPid(o.getPid());
        order.setPname(o.getPname());
        order.setPprice(o.getPprice());

        int inserts = orderService.inserts(order);
        if(inserts!=0){
            return "下单成功";
        }
        return "下单失败";
    }

}

server:

OrderService:

package com.order.service;


import com.sal.entity.Order;

/**
 * @Author bian
 * @Date 2022/8/18 20:03
 * @PackageName:com.order.service
 * @ClassName: OrderService
 * @Description: TODO
 * @Version 1.0
 */
public interface OrderService {

    int inserts(Order order);
}

impl:

OrderServiceImpl:

package com.order.service.impl;

import com.order.dao.OrderMapper;
import com.order.service.OrderService;
import com.sal.entity.Order;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @Author bian
 * @Date 2022/8/18 20:04
 * @PackageName:com.order.service.impl
 * @ClassName: OrderServiceImpl
 * @Description: TODO
 * @Version 1.0
 */
@Service
public class OrderServiceImpl implements OrderService {

    @Autowired
    private OrderMapper orderMapper;

    @Override
    public int inserts(Order order) {
        return orderMapper.insert(order);
    }
}

dao:

OrderMapper:

package com.order.dao;


import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sal.entity.Order;
import org.apache.ibatis.annotations.Mapper;

/**
 * @Author bian
 * @Date 2022/8/18 20:03
 * @PackageName:com.order.dao
 * @ClassName: OrderMapper
 * @Description: TODO
 * @Version 1.0
 */
@Mapper
public interface OrderMapper extends BaseMapper<Order> {
}

启动类:

OrderApp:

package com.order;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

/**
 * @Author bian
 * @Date 2022/8/18 18:07
 * @PackageName:com.sal.produce
 * @ClassName: ProductApp
 * @Description: TODO
 * @Version 1.0
 */
//启动类
@SpringBootApplication
//开启feign注解
@EnableFeignClients
public class OrderApp {
    public static void main(String[] args) {
        SpringApplication.run(OrderApp.class,args);
    }

    @Bean
    //ribbon借助RestTemplate完成负载均衡
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

配置类:

#为了以后配置集群,设定接口为8080~~8099之间
server.port=8082

#sql配置
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/springcould?serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123456

#sql日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl


#指定微服务名称
spring.application.name=order

#指定服务中心接口  默认接口是8848 我这是后面配置的负载均衡配置了两个备用接口
spring.cloud.nacos.discovery.server-addr=localhost:82

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值