Java技术债务Java技术债务

  •  首页
  •  分类
  •  归档
  •  标签
  • 博客日志
  • 资源分享
  •  友链
  •  关于本站
注册
登录

Spring Cloud Alibaba+Nacos的介绍与实战(一)

Java,Spring Cloud

文章目录

  • 目的
  • Spring
  • Cloud
  • Alibaba
  • Spring
  • Cloud和Spring
  • Cloud
  • Alibaba
  • Spring
  • Cloud
  • Alibaba
  • 包含组件
  • Spring
  • Cloud
  • Alibaba
  • 功能
  • nacos服务注册
  • 新建父工程
  • 测试

目的

最近发现我对自己的博客https://www.cuzib.top的监控少之又少,无论从服务器资源上,还是从服务治理上,或者说服务日志上等等。从开始拥有自己的服务器,到上线自己的博客这几个月之间,由于缺乏服务器相关安全性知识,导致服务器以及博客前后遭到了三次的攻击。

服务器被攻击三次总结的文章:

  • 服务器被攻击了三次,还把我的数据库删除了,还想要我汇钱赎回数据
  • MySQL数据库被攻击,被删库勒索,逼迫我使出洪荒之力进行恢复数据

并且,我现在的博客由于时间上的仓促,当时只是做了个捡漏的博客无论从页面还是后端,结构简单的单体应用服务,前后端并没有完全分离,牵一发而动全身。

所以,最近准备改造我的博客。 前端技术:vue 后端准备使用微服务框架,比如:Spring Cloud Alibaba全家桶(nacos、dubbo等)

Spring Cloud Alibaba

Spring Cloud Alibaba 是阿里巴巴提供的微服务开发一站式解决方案,是阿里巴巴开源中间件与 Spring Cloud 体系的融合。

提起微服务,不得不提 Spring Cloud 全家桶系列,SpringCloud 是若干个框架的集合,包括 spring-cloud-config、spring-cloud-bus 等近 20 个子项目,提供了服务治理、服务网关、智能路由、负载均衡、断路器、监控跟踪、分布式消息队列、配置管理等领域的解决方案。

Spring Cloud 通过 Spring Boot 风格的封装,屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、容易部署的分布式系统开发工具包。

一般来说,Spring Cloud 包含以下组件,主要以 Netflix 开源为主: Spring Cloud Alibaba+Nacos的介绍与实战(一) - Java技术债务 同 Spring Cloud 一样,Spring Cloud Alibaba 也是一套微服务解决方案,包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。

依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。

作为 Spring Cloud 体系下的新实现,Spring Cloud Alibaba 跟官方的组件或其它的第三方实现如 Netflix, Consul,Zookeeper 等对比,具备了更多的功能。

Spring Cloud和Spring Cloud Alibaba

Spring Cloud Alibaba+Nacos的介绍与实战(一) - Java技术债务 改造博客的过程中也学习一些Spring Cloud Alibaba相关技术,比如:nacos、dubbo等。

Spring Cloud Alibaba 包含组件

Spring Cloud Alibaba+Nacos的介绍与实战(一) - Java技术债务 Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

Sentinel:把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

RocketMQ:开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。

Dubbo:这个就不用多说了,在国内应用非常广泛的一款高性能 Java RPC 框架。

Seata:阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。

Arthas:开源的Java动态追踪工具,基于字节码增强技术,功能非常强大。

Spring Cloud Alibaba 功能

那么作为微服务解决方案, Spring Cloud Alibaba是如何支持微服务治理的各个功能。

服务注册与发现

Spring Cloud Alibaba 基于 Nacos 提供 spring-cloud-alibaba-starter-nacos-discovery & spring-cloud-alibaba-starter-nacos-config 实现了服务注册 & 配置管理功能。依靠 @EnableDiscoveryClient 进行服务的注册,兼容 RestTemplate & OpenFeign 的客户端进行服务调用。

适配 Spring Cloud 服务注册与发现标准,默认集成了 Ribbon 的支持。

支持多协议的服务调用

Spring Cloud 默认的服务调用依赖 OpenFeign 或 RestTemplate 使用 REST 进行调用。

使用 @DubboTransported 注解可将底层的 Rest 协议无缝切换成 Dubbo RPC 协议,进行 RPC 调用。

@FeignClient("dubbo-provider")
@DubboTransported(protocol = "dubbo")
public interface DubboFeignRestService {
  @GetMapping(value = "/param")
  String param(@RequestParam("param") String param);

  @PostMapping("/saveB")
  String saveB(@RequestParam("a") int a, @RequestParam("b") String b);
}

服务限流降级

作为稳定性的核心要素之一,服务限流和降级是微服务领域特别重要的一环,Spring Cloud Alibaba 基于 Sentinel,对 Spring 体系内基本所有的客户端,网关进行了适配,

默认支持 WebServlet、WebFlux, OpenFeign、RestTemplate、Spring Cloud Gateway, Zuul, Dubbo 和 RocketMQ 限流降级功能的接入。

Sentinel应用比较简单,只需引入 starter,即可生效,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。

微服务消息驱动

支持为微服务应用构建消息驱动能力,基于 Spring Cloud Stream 提供 Binder 的新实现: Spring Cloud Stream RocketMQ Binder,

也新增了 Spring Cloud Bus 消息总线的新实现 Spring Cloud Bus RocketMQ。

分布式事务

使用 Seata 解决微服务场景下面临的分布式事务问题。

使用 @GlobalTransactional 注解,在微服务中传递事务上下文,可以对业务零侵入地解决分布式事务问题。

阿里云提供的商业能力

通过上面提到的OSS,schedulerx等组件,开发者可以在阿里云上实现对象存储,分布式任务调度等功能。

nacos服务注册

首先是nacos的安装 下载地址:https://github.com/alibaba/nacos/releases 不过github下载极其特别的慢,当然你能翻墙或者使用其他技巧下载很快的话,你就不需要通过以下方式下载了。 源码:https://cuizb.top/static/share/nacos-server-2.0.3.tar.gz windows/liunx版:https://cuizb.top/static/share/nacos-server-2.0.3.zip

下载后解压,然后在/bin下,直接双击运行startup.cmd 即可默认启动单机版Nacos。

当然,你可以根据自己需要下载不同的平台系统,运行不同的命令,运行Nacos:

  • Windows:cmd startup.cmd -m standalone

  • Linux/Unix/Mac:sh startup.sh -m standalone Spring Cloud Alibaba+Nacos的介绍与实战(一) - Java技术债务 地址:http://127.0.0.1:8848/nacos 账号:nacos 密码:nacos

首页 Spring Cloud Alibaba+Nacos的介绍与实战(一) - Java技术债务

新建父工程

代码已经提交到gitee 地址:https://gitee.com/culzb/cloud-alibaba-demo 父工程:cloud-alibaba-demo Spring Cloud Alibaba+Nacos的介绍与实战(一) - Java技术债务 pom.xml主要配置

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.1.RELEASE</version>
</parent>
<modules>
  <module>gtw</module>
    <module>demo-service</module>
</modules>

<properties>
    <java.version>1.8</java.version>
    <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
</properties>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>0.9.0.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>0.9.0.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
            </dependency>
            <!--  nacos注册中心-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            </dependency>
        </dependencies>
    </dependencyManagement>
    </dependencies>
</dependencyManagement>
<build>
    <finalName>${project.artifactId}</finalName>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

新建子模块demo-service

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>com.cuizb</groupId>
		<artifactId>cloud-alibaba-demo</artifactId>
		<version>1.0</version>
	</parent>
	<groupId>com.cuizb.cloud.alibaba</groupId>
	<artifactId>demo-service</artifactId>
	<version>1.0</version>
	<name>demo-service</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-web</artifactId>
		</dependency>

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

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

</project>

启动类加上注解 @EnableDiscoveryClient

package com.cuizb.cloud.alibaba.demoservice;

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

@EnableDiscoveryClient
@SpringBootApplication
public class DemoServiceApplication {

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

新建api接口,提供服务

package com.cuizb.cloud.alibaba.demoservice.api;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Author cuizb
 * @Date 2022-03-19 18:09:31
 * @Desc *
 */
@RestController
public interface DemoService {

    @GetMapping("/hello")
    String hello(@RequestParam("name") String name);
}

实现类

package com.cuizb.cloud.alibaba.demoservice.controller;

import com.cuizb.cloud.alibaba.demoservice.api.DemoService;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

/**
 * @Author cuizb
 * @Date 2022-03-19 18:10:05
 * @Desc *
 */
@Service
public class DemoServiceImpl implements DemoService {

    @Override
    public String hello(String name) {
        if (StringUtils.isEmpty(name)) {
            name = "cuizb";
        }
        return "hello , " + name + " , i am demoService.";
    }
}

配置application.properties

server.port = 8701
spring.application.name=demo-service

spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

启动程序 Spring Cloud Alibaba+Nacos的介绍与实战(一) - Java技术债务

新建子模块服务消费者gtw

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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>com.cuizb</groupId>
		<artifactId>cloud-alibaba-demo</artifactId>
		<version>1.0</version>
	</parent>
	<groupId>com.cuizb.cloud.alibaba</groupId>
	<artifactId>gtw</artifactId>
	<version>1.0</version>
	<name>gtw</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-web</artifactId>
		</dependency>

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

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

</project>

启动类加入注解@EnableDiscoveryClient

package com.cuizb.cloud.alibaba.gtw;

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

@EnableDiscoveryClient
@SpringBootApplication
public class GtwApplication {

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

}

配置类RestTemplateConfig,将RestTemplate的bean注入到spring容器中

package com.cuizb.cloud.alibaba.gtw.config;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

/**
 * @Author cuizb
 * @Date 2022-03-19 18:16:44
 * @Desc *
 */
@Configuration
public class RestTemplateConfig {

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

新建路由

package com.cuizb.cloud.alibaba.gtw.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

/**
 * @Author cuizb
 * @Date 2022-03-19 18:12:16
 * @Desc *
 */
@RestController
public class GtwServiceImpl {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/hello")
    public String hello(@RequestParam("name") String name) {
        System.out.println(name);
        return restTemplate.getForObject("http://demo-service/hello?name=" + name , String.class);

    }
}

配置application.properties


server.port = 8705
spring.application.name=gtw

spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

启动程序 Spring Cloud Alibaba+Nacos的介绍与实战(一) - Java技术债务

测试

http://localhost:8705/hello?name=cuizb1 Spring Cloud Alibaba+Nacos的介绍与实战(一) - Java技术债务

目的

最近发现我对自己的博客https://www.cuzib.top的监控少之又少,无论从服务器资源上,还是从服务治理上,或者说服务日志上等等。从开始拥有自己的服务器,到上线自己的博客这几个月之间,由于缺乏服务器相关安全性知识,导致服务器以及博客前后遭到了三次的攻击。

服务器被攻击三次总结的文章:

  • 服务器被攻击了三次,还把我的数据库删除了,还想要我汇钱赎回数据
  • MySQL数据库被攻击,被删库勒索,逼迫我使出洪荒之力进行恢复数据

并且,我现在的博客由于时间上的仓促,当时只是做了个捡漏的博客无论从页面还是后端,结构简单的单体应用服务,前后端并没有完全分离,牵一发而动全身。

所以,最近准备改造我的博客。 前端技术:vue 后端准备使用微服务框架,比如:Spring Cloud Alibaba全家桶(nacos、dubbo等)

Spring Cloud Alibaba

Spring Cloud Alibaba 是阿里巴巴提供的微服务开发一站式解决方案,是阿里巴巴开源中间件与 Spring Cloud 体系的融合。

提起微服务,不得不提 Spring Cloud 全家桶系列,SpringCloud 是若干个框架的集合,包括 spring-cloud-config、spring-cloud-bus 等近 20 个子项目,提供了服务治理、服务网关、智能路由、负载均衡、断路器、监控跟踪、分布式消息队列、配置管理等领域的解决方案。

Spring Cloud 通过 Spring Boot 风格的封装,屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、容易部署的分布式系统开发工具包。

一般来说,Spring Cloud 包含以下组件,主要以 Netflix 开源为主: Spring Cloud Alibaba+Nacos的介绍与实战(一) - Java技术债务 同 Spring Cloud 一样,Spring Cloud Alibaba 也是一套微服务解决方案,包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。

依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。

作为 Spring Cloud 体系下的新实现,Spring Cloud Alibaba 跟官方的组件或其它的第三方实现如 Netflix, Consul,Zookeeper 等对比,具备了更多的功能。

Spring Cloud和Spring Cloud Alibaba

Spring Cloud Alibaba+Nacos的介绍与实战(一) - Java技术债务 改造博客的过程中也学习一些Spring Cloud Alibaba相关技术,比如:nacos、dubbo等。

Spring Cloud Alibaba 包含组件

Spring Cloud Alibaba+Nacos的介绍与实战(一) - Java技术债务 Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

Sentinel:把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

RocketMQ:开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。

Dubbo:这个就不用多说了,在国内应用非常广泛的一款高性能 Java RPC 框架。

Seata:阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。

Arthas:开源的Java动态追踪工具,基于字节码增强技术,功能非常强大。

Spring Cloud Alibaba 功能

那么作为微服务解决方案, Spring Cloud Alibaba是如何支持微服务治理的各个功能。

服务注册与发现

Spring Cloud Alibaba 基于 Nacos 提供 spring-cloud-alibaba-starter-nacos-discovery & spring-cloud-alibaba-starter-nacos-config 实现了服务注册 & 配置管理功能。依靠 @EnableDiscoveryClient 进行服务的注册,兼容 RestTemplate & OpenFeign 的客户端进行服务调用。

适配 Spring Cloud 服务注册与发现标准,默认集成了 Ribbon 的支持。

支持多协议的服务调用

Spring Cloud 默认的服务调用依赖 OpenFeign 或 RestTemplate 使用 REST 进行调用。

使用 @DubboTransported 注解可将底层的 Rest 协议无缝切换成 Dubbo RPC 协议,进行 RPC 调用。

@FeignClient("dubbo-provider")
@DubboTransported(protocol = "dubbo")
public interface DubboFeignRestService {
  @GetMapping(value = "/param")
  String param(@RequestParam("param") String param);

  @PostMapping("/saveB")
  String saveB(@RequestParam("a") int a, @RequestParam("b") String b);
}

服务限流降级

作为稳定性的核心要素之一,服务限流和降级是微服务领域特别重要的一环,Spring Cloud Alibaba 基于 Sentinel,对 Spring 体系内基本所有的客户端,网关进行了适配,

默认支持 WebServlet、WebFlux, OpenFeign、RestTemplate、Spring Cloud Gateway, Zuul, Dubbo 和 RocketMQ 限流降级功能的接入。

Sentinel应用比较简单,只需引入 starter,即可生效,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。

微服务消息驱动

支持为微服务应用构建消息驱动能力,基于 Spring Cloud Stream 提供 Binder 的新实现: Spring Cloud Stream RocketMQ Binder,

也新增了 Spring Cloud Bus 消息总线的新实现 Spring Cloud Bus RocketMQ。

分布式事务

使用 Seata 解决微服务场景下面临的分布式事务问题。

使用 @GlobalTransactional 注解,在微服务中传递事务上下文,可以对业务零侵入地解决分布式事务问题。

阿里云提供的商业能力

通过上面提到的OSS,schedulerx等组件,开发者可以在阿里云上实现对象存储,分布式任务调度等功能。

nacos服务注册

首先是nacos的安装 下载地址:https://github.com/alibaba/nacos/releases 不过github下载极其特别的慢,当然你能翻墙或者使用其他技巧下载很快的话,你就不需要通过以下方式下载了。 源码:https://cuizb.top/static/share/nacos-server-2.0.3.tar.gz windows/liunx版:https://cuizb.top/static/share/nacos-server-2.0.3.zip

下载后解压,然后在/bin下,直接双击运行startup.cmd 即可默认启动单机版Nacos。

当然,你可以根据自己需要下载不同的平台系统,运行不同的命令,运行Nacos:

  • Windows:cmd startup.cmd -m standalone

  • Linux/Unix/Mac:sh startup.sh -m standalone Spring Cloud Alibaba+Nacos的介绍与实战(一) - Java技术债务 地址:http://127.0.0.1:8848/nacos 账号:nacos 密码:nacos

首页 Spring Cloud Alibaba+Nacos的介绍与实战(一) - Java技术债务

新建父工程

代码已经提交到gitee 地址:https://gitee.com/culzb/cloud-alibaba-demo 父工程:cloud-alibaba-demo Spring Cloud Alibaba+Nacos的介绍与实战(一) - Java技术债务 pom.xml主要配置

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.1.RELEASE</version>
</parent>
<modules>
  <module>gtw</module>
    <module>demo-service</module>
</modules>

<properties>
    <java.version>1.8</java.version>
    <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
</properties>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>0.9.0.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>0.9.0.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
            </dependency>
            <!--  nacos注册中心-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            </dependency>
        </dependencies>
    </dependencyManagement>
    </dependencies>
</dependencyManagement>
<build>
    <finalName>${project.artifactId}</finalName>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

新建子模块demo-service

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>com.cuizb</groupId>
		<artifactId>cloud-alibaba-demo</artifactId>
		<version>1.0</version>
	</parent>
	<groupId>com.cuizb.cloud.alibaba</groupId>
	<artifactId>demo-service</artifactId>
	<version>1.0</version>
	<name>demo-service</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-web</artifactId>
		</dependency>

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

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

</project>

启动类加上注解 @EnableDiscoveryClient

package com.cuizb.cloud.alibaba.demoservice;

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

@EnableDiscoveryClient
@SpringBootApplication
public class DemoServiceApplication {

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

新建api接口,提供服务

package com.cuizb.cloud.alibaba.demoservice.api;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Author cuizb
 * @Date 2022-03-19 18:09:31
 * @Desc *
 */
@RestController
public interface DemoService {

    @GetMapping("/hello")
    String hello(@RequestParam("name") String name);
}

实现类

package com.cuizb.cloud.alibaba.demoservice.controller;

import com.cuizb.cloud.alibaba.demoservice.api.DemoService;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

/**
 * @Author cuizb
 * @Date 2022-03-19 18:10:05
 * @Desc *
 */
@Service
public class DemoServiceImpl implements DemoService {

    @Override
    public String hello(String name) {
        if (StringUtils.isEmpty(name)) {
            name = "cuizb";
        }
        return "hello , " + name + " , i am demoService.";
    }
}

配置application.properties

server.port = 8701
spring.application.name=demo-service

spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

启动程序 Spring Cloud Alibaba+Nacos的介绍与实战(一) - Java技术债务

新建子模块服务消费者gtw

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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>com.cuizb</groupId>
		<artifactId>cloud-alibaba-demo</artifactId>
		<version>1.0</version>
	</parent>
	<groupId>com.cuizb.cloud.alibaba</groupId>
	<artifactId>gtw</artifactId>
	<version>1.0</version>
	<name>gtw</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-web</artifactId>
		</dependency>

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

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

</project>

启动类加入注解@EnableDiscoveryClient

package com.cuizb.cloud.alibaba.gtw;

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

@EnableDiscoveryClient
@SpringBootApplication
public class GtwApplication {

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

}

配置类RestTemplateConfig,将RestTemplate的bean注入到spring容器中

package com.cuizb.cloud.alibaba.gtw.config;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

/**
 * @Author cuizb
 * @Date 2022-03-19 18:16:44
 * @Desc *
 */
@Configuration
public class RestTemplateConfig {

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

新建路由

package com.cuizb.cloud.alibaba.gtw.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

/**
 * @Author cuizb
 * @Date 2022-03-19 18:12:16
 * @Desc *
 */
@RestController
public class GtwServiceImpl {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/hello")
    public String hello(@RequestParam("name") String name) {
        System.out.println(name);
        return restTemplate.getForObject("http://demo-service/hello?name=" + name , String.class);

    }
}

配置application.properties


server.port = 8705
spring.application.name=gtw

spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

启动程序 Spring Cloud Alibaba+Nacos的介绍与实战(一) - Java技术债务

测试

http://localhost:8705/hello?name=cuizb1 Spring Cloud Alibaba+Nacos的介绍与实战(一) - Java技术债务

完
  • 本文作者:Java技术债务
  • 原文链接: https://cuizb.top/myblog/article/1647705645
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY 3.0 CN协议进行许可。转载请署名作者且注明文章出处。
阅读全文
Java技术债务

Java技术债务

Java技术债务
Java技术债务
热门文章
  1. ClickHouse使用过程中的一些查询优化(六)2003
  2. MySQL数据库被攻击,被删库勒索,逼迫我使出洪荒之力进行恢复数据764
  3. MySQL主从同步原理458
  4. 线程池的理解以及使用414
  5. Spring Cloud Gateway整合nacos实战(三)409
分类
  • Java
    30篇
  • 设计模式
    27篇
  • 数据库
    20篇
  • Spring
    18篇
  • MySQL
    13篇
  • ClickHouse
    11篇
  • Kubernetes
    10篇
  • Redis
    9篇
  • Docker
    8篇
  • SpringBoot
    7篇
  • JVM
    6篇
  • Linux
    5篇
  • Spring Cloud
    5篇
  • 多线程
    5篇
  • Netty
    4篇
  • Kafka
    4篇
  • 面经
    4篇
  • Nginx
    3篇
  • JUC
    3篇
  • 随笔
    2篇
  • 分布式
    1篇
  • MyBatis
    1篇
  • 报错合集
    1篇
  • 生活记录
    1篇
  • 源码
    1篇
  • 性能优化
    1篇

最新评论

  • MySQL数据库被攻击,被删库勒索,逼迫我使出洪荒之力进行恢复数据2022-05-06
    Java技术债务:@capture 一起探讨学习,服务器被黑很正常,及时做好备份以及做好防护
  • MySQL数据库被攻击,被删库勒索,逼迫我使出洪荒之力进行恢复数据2022-04-13
    capture:我的刚上线两天,网站里就两篇文章也被攻击了,纳闷
  • Java常用集合List、Map、Set介绍以及一些面试问题2022-01-18
    Java技术债务:HashSet和TreeSet 相同点:数据不能重复 不同点: 1、底层存储结构不同; HashSet底层使用HashMap哈希表存储 TreeSet底层使用TreeMap树结构存储 2、唯一性方式不同 HashSet底层使用hashcode()和equal()方法判断 TreeSet底层使用Comparable接口的compareTo判断的 3、HashSet无序,TreeSet有序
  • undefined2021-12-14
    Java技术债务:如果不指定线程池,CompletableFuture会默认使用ForkJoin线程池,如果同一时间出现大量请求的话,会出现线程等待问题,建议使用自定义线程池。。。
  • undefined2021-12-02
    you:很好,对于小白相当不错了,谢谢
  • CSDN
  • 博客园
  • 程序猿DD
  • 纯洁的微笑
  • spring4all
  • 廖雪峰的官方网站
  • 猿天地
  • 泥瓦匠BYSocket
  • crossoverJie
  • 张先森个人博客
  • 越加网

© 2021-2022 Java技术债务 - Java技术债务 版权所有
总访问量 0 次 您是本文第 0 位童鞋
豫ICP备2021034516号
Java技术债务 豫公网安备 51011402000164号

微信公众号

Java技术债务
Java技术债务

专注于Spring,SpringBoot等后端技术探索

以及MySql数据库开发和Netty等后端流行框架学习

日志
分类
标签
RSS

有不足之处也希望各位前辈指出