spring-cloud-alibaba学习一(服务注册、发现、消费)

简单说明

spring-cloud-alibaba的服务注册发现中心是阿里巴巴自研并开源的nacos,所以使用spring-cloud-alibaba时,不再自己搭建服务注册发现中心,直接使用nacos即可。具体如何安装nacos,请在nacos官网的快速开始栏目学习(我这太辣鸡电脑其他网站都打开,就是打不开nacos官网,要不然给截个图了,哭死。)nacos安装完成后,启动,在浏览器访问http://[IP]:8848/nacos可进入控制台,默认的账号密码:nacos

搭建环境

开发工具:IDEA
JDK : jdk1.8
项目构建:maven3.6

一.新建一个SpringBoot项目

新建过程中修改一个点,如下图:
项目的type改为Maven POM
其他的照旧,搭建完成后,如下图:
在这里插入图片描述
在pom.xml中添加

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>2.1.0.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

完整的pom.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<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>
    <packaging>pom</packaging>
    <modules>
        <module>server_provider</module>
        <module>server_consumer</module>
    </modules>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.7.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.myc</groupId>
    <artifactId>spring-cloud-alibaba-demo2</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring-cloud-alibaba-demo2</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.1.0.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

这就是项目基础框架,以后的模块都在这个项目基础上增加。

新增服务提供模块

在基础项目上右键->new->module,选择一个maven项目,如下图:
在这里插入图片描述
按照常规流程创建maven项目。创建完成后结果如下图:
在这里插入图片描述
pom.xml中需要增加一个依赖:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

完整的pom.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<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">
    <parent>
        <artifactId>spring-cloud-alibaba-demo2</artifactId>
        <groupId>com.myc</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <description>这是一个服务提供方,别的服务要调用我这里提供的一些服务</description>
    <artifactId>server_provider</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>
</project>

然后在java包下创建一个项目启动类,再创建一个controller入口类。
在resourece下创建application.yml文件(也可以是applicaiton.properties,看个人喜好),结构与内容如下:
在这里插入图片描述
application.yml如下:

server:
  port: 9000
spring:
  application:
    name: server-provider # 服务名
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # 这里配置nacos的服务地址

ServerProviderApp.java如下:

package com.myc;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**
 * @author mayc
 * @description:
 * @date 2019/8/14 0014 下午 2:52
 */
@SpringBootApplication
@EnableDiscoveryClient
public class ServerProviderApp {

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

HelloController.java代码如下:

package com.myc.controller;

import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author mayc
 * @description:
 * @date 2019/8/14 0014 下午 2:55
 */
@RestController
public class HelloController {

    @RequestMapping("/hello/{msg}")
    public String hello(@PathVariable String msg) {
        return msg + "进来了!请坐请坐";
    }
}

到这一步,第一个服务提供者基本完成,启动该模块,然后打开nacos控制台,查看服务是否已经注册到nacos,
在这里插入图片描述
我们看到我们的服务已经注册到nacos。

创建服务消费方

跟创建服务提供方一样的步骤,创建一个模块,作为服务提供方,创建完成后的结构如下图:
在这里插入图片描述
由于服务消费方需要调用其他服务,而调用服务有多种方式,本次学习使用是restTemplate和springCloud提供的Feign方式。贴出各个文件的代码如下
pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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">
    <parent>
        <artifactId>spring-cloud-alibaba-demo2</artifactId>
        <groupId>com.myc</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <description>这是服务消费方</description>
    <artifactId>server_consumer</artifactId>
    <properties>
        <spring-cloud-starter-openfeign.version>2.1.2.RELEASE</spring-cloud-starter-openfeign.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>${spring-cloud-starter-openfeign.version}</version>
        </dependency>
    </dependencies>

</project>

application.yml

server:
  port: 9001
spring:
  application:
    name: server-consumer #服务名
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848

ServerConsumerApp.java

package com.myc;

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.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

/**
 * @author mayc
 * @description:
 * @date 2019/8/14 0014 下午 2:58
 */
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ServerConsumerApp {

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

    //添加 @LoadBlanced 注解,使得 RestTemplate 接入 Ribbon,这样就能够实现负载均衡
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

HelloService

package com.myc.service;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 *使用 @FeignClient 注解将 HelloService 这个接口包装成一个 FeignClient,
 * 属性 name 对应服务提供方的服务名 server-provider。
 *
 * hello 方法上的 @RequestMapping 注解将 hello 方法与 URL "/hello/{msg}" 相对应,
 * @PathVariable 注解将 URL 路径中的 {msg} 对应成 hello 方法的参数 msg
 */
@FeignClient(name = "server-provider")
public interface HelloService {

    @RequestMapping("/hello/{msg}")
    String hello(@PathVariable("msg") String msg);
}

HelloController.java

package com.myc.controller;

import com.myc.service.HelloService;
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.RestController;
import org.springframework.web.client.RestTemplate;

/**
 * @author mayc
 * @description:
 * @date 2019/8/14 0014 下午 3:01
 */
@RestController
public class HelloController {

    public static final String SERVER_PROVIDER_NAME = "server-provider";

    @Autowired(required = true)
    private HelloService helloService;
    @Autowired
    private RestTemplate restTemplate;

    /**
     * 通过restTemplate方式消费服务
     * @param msg
     * @return
     */
    @RequestMapping("hello-rest/{msg}")
    public String restHello(@PathVariable("msg") String msg) {
        String msg1 = msg + ",你好";
        return restTemplate.getForObject("http://" + SERVER_PROVIDER_NAME + "/hello/" + msg1, String.class);
    }

    /**
     * 通过feign方式消费服务
     * @param msg
     * @return
     */
    @RequestMapping("hello-feign/{msg}")
    public String feignHello(@PathVariable("msg") String msg) {
        String msg2 = msg + ", 我也好";
        return helloService.hello(msg2);
    }
}

第二个服务也创建完成。启动该服务,到nacos控制台查看,是否存在该服务。

测试服务是否可以调用

打开浏览器,访问http://localhost:9001/hello-rest/我叫abc,结果:
在这里插入图片描述
访问http://localhost:9001/hell-feign/我叫abc,结果:
在这里插入图片描述
至此,基于spring-cloud-alibaba和nacos的服务注册发现基本弯完成。
文章基于spring-cloud-alibaba在github的说明文档进行的学习,如有错误,请指正。

发布了33 篇原创文章 · 获赞 24 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/Myc_CSDN/article/details/99577480