欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SpringCloud之消费服务(rest+ribbon)|第二章-yellowcong

程序员文章站 2022-03-15 23:38:08
...

通过消费者的方式来进行消费服务,而不是通过像上一篇,那种方式,比较的菜,而且如果使用那种方式,还不如直接弄传统的方式来开发,没必要引入Springcloud的框架了,对于SpringCloud的服务消费方式有两种:1、通过rest+ribbon的方式,2,通过Feign的方式。我们先介绍通过ribbon 的方式。实现通过Ribbon消费服务,主要有三个步骤:1、配置pom.xml,加入依赖,2、配置application.yml,设定服务,3、配置启动类,添加RestTemplate,4、配置Service层,添加服务,5、配置Controller层,暴漏服务。最后测试的时候,一定要注意,先看Eureka的管控台,看服务是否都启动完了。

代码地址

https://gitee.com/yellowcong/springcloud/tree/master/chapter2

目录结构

在这次的演示代码中, 我配置了两个服务提供
SpringCloud之消费服务(rest+ribbon)|第二章-yellowcong

服务架构

节点 服务 项目名
yellowcong.com:8761 eureka注册服务 eureka-server
yellowcong.com:8762 提供服务1 eureka-client
yellowcong.com:8763 提供服务2 eureka-client2
yellowcong.com:8764 ribbon服务 ribbon-server

Riboon 服务搭建

实现通过Ribbon消费服务,主要有三个步骤:1、配置pom.xml,加入依赖,2、配置application.yml,设定服务,3、配置启动类,添加RestTemplate,4、配置Service层,添加服务,5、配置Controller层,暴漏服务。

1、配置pom.xml

配置riboon服务,需要导入spring-cloud-starter-eureka-serverspring-cloud-starter-ribbon这两个关键的依赖。

<!--eureka server -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka-server</artifactId>
    <version>1.3.0.RELEASE</version><!--$NO-MVN-MAN-VER$-->
</dependency>

<dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-ribbon</artifactId>
     <version>1.3.0.RELEASE</version><!--$NO-MVN-MAN-VER$-->
 </dependency>

下面是完整的pom.xml 配置文件

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>yellowcong.com</groupId>
    <artifactId>cas-client-springboot</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>cas-client-springboot</name>
    <url>http://maven.apache.org</url>

    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

    <!-- 引用父类依赖 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.10.RELEASE</version>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>

        <!--eureka server -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
            <version>1.3.0.RELEASE</version><!--$NO-MVN-MAN-VER$-->
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-ribbon</artifactId>
            <version>1.3.0.RELEASE</version><!--$NO-MVN-MAN-VER$-->
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

    </dependencies>
    <build>
        <plugins>
            <!-- 添加spring的插件, 就可以直接通过 mvn spring-boot:run 运行了 -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <dependencies>
                    <dependency>
                        <groupId>org.springframework</groupId>
                        <artifactId>springloaded</artifactId>
                        <version>1.2.4.RELEASE</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>
</project>

2、配置application.yml

在riboon的配置中,需要设置eureka的中心,向注册中心注册自己的服务。

#配置eureka 的注册中心
eureka:
  client:
    serviceUrl:
      defaultZone: http://yellowcong.com:8761/eureka/

# 注册服务的端口
server:
  port: 8764

#配置当前服务的名称
spring:
  application:
    name: service-ribbon

3、配置启动类

我们在配置RestTemplate 的时候,添加了@LoadBalanced注解,表示这个服务是负载均衡的。当访问服务的时候,会自动进行负载均衡的操作。

package com.yellowcong;

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

@SpringBootApplication
@EnableDiscoveryClient
public class ConfigMain {

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

    /**
     * 创建日期:2018年3月16日<br/>
     * 创建用户:yellowcong<br/>
     * 功能描述:设定负载均衡策略
     * @return
     */
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

}

4、配置Service

通过RestTemplate 的getForObject方法来执行存在于Eureka的服务。同时还需要注意的一点是,我们没有写具体的服务地址,而是写的是在Eureka中注册的服务名称,ribbon会为我们替换成实例所指向的地址。
SpringCloud之消费服务(rest+ribbon)|第二章-yellowcong

package com.yellowcong.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

/**
 * 创建日期:2018年3月16日 <br/>
 * 创建用户:yellowcong <br/>
 * 功能描述:
 */
@Service
public class HelloService {
    @Autowired
    RestTemplate restTemplate;

    /**
     * 创建日期:2018年3月16日<br/>
     * 创建用户:yellowcong<br/>
     * 功能描述:通过rest的方式来调用模板
     * @param name
     * @return
     */
    public String sayHi(String name) {
        //可以看到执行的路径直接是SERVICE-HI ,在ribbon中,在ribbon中它会根据服务名来选择具体的服务实例,根据服务实例在请求的时候会用具体的url替换掉服务名
        return restTemplate.getForObject("http://SERVICE-HI/hi/" + name, String.class);
    }
}

5、配置Controller

Controller的作用,就是将service配置的服务暴漏出去,我们只需要同被请求的服务的访问的方式一致即可,再说,我们可以直接通过ribbon来访问提供的服务,我们可以自定义这些服务的名称,不一定非要和被调用的服务名 一毛一样。

package com.yellowcong.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.yellowcong.service.HelloService;

/**
 * 创建日期:2018年3月16日 <br/>
 * 创建用户:yellowcong <br/>
 * 功能描述:将提供的服务,用ribbon封装一层
 */
@RestController
public class HelloController {
    @Autowired
    HelloService helloService;

    /**
     * 创建日期:2018年3月16日<br/>
     * 创建用户:yellowcong<br/>
     * 功能描述:直接访问riboon的服务地址  /hi
     * @param name
     * @return
     */
    @RequestMapping(value = "/hi/{name}")
    public String hi(@PathVariable String name) {
        return helloService.sayHi(name);
    }
}

6、运行测试

启动的顺序如下,必须先把注册服务端搞起来,不然谁也别想玩了。

项目名 启动顺序
eureka-server 1
eureka-client 2
eureka-client2 3
ribbon-server 4

访问riboon站点 http://yellowcong.com:8764/hi/xxx,可以看到处理请求的服务器是变化的,说明负载均衡生效了。
SpringCloud之消费服务(rest+ribbon)|第二章-yellowcong

访问ribbon前,一定要先看服务两个服务是否都启动,不然死活都访问不到服务的。
SpringCloud之消费服务(rest+ribbon)|第二章-yellowcong

常见问题

Maven包导入问题

可以看到,我这个包,又是导入不进来,所以挺烦人的,解决办法,就是加入一个版本号即可
SpringCloud之消费服务(rest+ribbon)|第二章-yellowcong

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-ribbon</artifactId>
    <version>1.3.0.RELEASE</version><!--$NO-MVN-MAN-VER$-->
</dependency>

参考文章

https://springcloud.cc/spring-cloud-dalston.html

相关标签: 微服务