SpringCloud

1、常用依赖

1.1、继承starter parent,配置SpringBoot

配置继承spring-boot-starter-parent:

<parent>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-parent</artifactId>
     <version>2.3.9.RELEASE</version>
     <relativePath/>
</parent>

只需要在这里指定Spring Boot的版本号。如果导入其他的starters,你可以完全省略版本号。

使用这个配置,你还可以通过property覆盖内部的依赖。例如:

<!--统一管理版本信息-->
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
    <spring-cloud.version>Hoxton.SR10</spring-cloud.version>
    <mysql.version>5.1.47</mysql.version>
    <mybatis.version>2.1.1</mybatis.version>
</properties>

1.2、不使用parent POM,配置Spring Boot

<dependencyManagement>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>2.5.5</version>
        <type>pom</type>
        <scope>import</scope>
    </dependency>
</dependencyManagement>

1.3、其它依赖

<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>
    <!-- mysql驱动 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>${mysql.version}</version>
    </dependency>
    <!--mybatis-->
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>${mybatis.version}</version>
    </dependency>
</dependencies>

2、application常用配置

server:
  port: 8002
spring:
  application:
    name: order-service
  datasource:
    username: root
    password: 123456
    url: jdbc:mysql://localhost:3306/db01?serverTimezone=UTC
    driver-class-name: com.mysql.jdbc.Driver
#开启日志
logging:
  level:
    com.mds: debug
#开启驼峰命名映射
mybatis:
  configuration:
    map-underscore-to-camel-case: true

3、服务的远程调用

3.1、注册RestTemplate

可以在springboot主启动类中直接注册:

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

    @Bean
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}

3.2、实现远程调用

@RestController
@RequestMapping("order")
public class OrderController {

    @Autowired
    private OrderService orderService;

    @Autowired
    private RestTemplate restTemplate;
    //请求链接:http://localhost:8002/order/100
    @RequestMapping("{id}")
    public Order qeuryOrder(@PathVariable("id") Integer id){
        //查询订单
        Order order = orderService.qeuryOrderById(id);
        //远程服务的url路径
        String local = "http://localhost:8001/queryUserById?id="+order.getUserId();
        //远程查询user-service服务中的用户,get用get post用post
        User user = restTemplate.getForObject(local, User.class);
        order.setUser(user);
        return order;
    }

}

3.3、提供者和消费者

在服务调用关系中,会有两个不同的角色:

服务提供者:一次业务中,被其它微服务调用的服务。(提供接口给其它微服务)

服务消费者:一次业务中,调用其它微服务的服务。(调用其它微服务提供的接口)

但是,服务提供者与服务消费者的角色并不是绝对的,而是相对于业务而言。

4、Eureka注册中心

4.1、搭建eureka-server

在父工程创建eureka-server模块

引入依赖:

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

4.2、配置application:

server:
  port: 7001
spring:
  application:
    name: eureka-server
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:7001/eureka

4.3、给主启动类添加注解

给eureka-server服务编写一个启动类,一定要添加一个@EnableEurekaServer注解,开启eureka的注册中心功能:

@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class,args);
    }
}

4.4、服务注册

将服务注册到eureka-server中

1)引入依赖

在user-service的pom文件中,引入下面的eureka-client依赖:

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

2)配置文件

在user-service的application.yml中配置,服务名称,eureka地址:

spring:
  application:
    name: userservice
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:7001/eureka

4.5、服务发现

1)前两步跟服务注册一样

  • 引入依赖
  • 配置eureka地址

2)服务拉取和负载均衡

在order-service的OrderApplication中,给RestTemplate这个Bean添加一个@LoadBalanced注解:

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

    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}

修改访问的url路径,用服务名代替ip、端口:

@RequestMapping("{id}")
public Order qeuryOrder(@PathVariable("id") Integer id){
    //查询订单
    Order order = orderService.qeuryOrderById(id);
    //远程服务的url路径
    String local = "http://USER-SERVICE/queryUserById?id="+order.getUserId();
    //远程查询user-service服务中的用户,get用get post用post
    User user = restTemplate.getForObject(local, User.class);
    order.setUser(user);
    return order;
}

4.6、注册中心总结

  1. 搭建eureka-server
    • 引入eureka-server依赖
    • 添加@EnableEurekaClient
    • 在application.yml中配置eureka-server地址
  2. 服务注册
    • 引入eureka-client依赖
    • 在application.yml中配置eureka-server地址
  3. 服务发现
    • 引入eureka-client依赖
    • 在application.yml中配置eureka-server地址
    • 给RestTemplate添加@LoadBalanced注解
    • 用服务提供者的服务名称远程调用

Q.E.D.

同是风华正茂,怎可甘拜下风