Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >初识SpringCloud微服务

初识SpringCloud微服务

作者头像
HUC思梦
发布于 2020-09-03 08:57:33
发布于 2020-09-03 08:57:33
3870
举报

本文使用生产端与消费端两个工程来展示微服务之间的调用方式

具体内容详见代码注释

生产端工程:

pom.xml

代码语言:javascript
AI代码解释
复制
<?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>

    <groupId>com.cloud.demo</groupId>
    <artifactId>micro-provider</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>micro-provider</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </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>

    <!--spring cloud依赖管理-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.SR2</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.2</version>
        </dependency>

        <!--引入zookeeper 测试时使用,只能连接本地的zookeeper-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zookeeper-all</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.zookeeper</groupId>
                    <artifactId>zookeeper</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.12</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>

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


</project>

application.yml配置

代码语言:javascript
AI代码解释
复制
spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql:///testdb?useSSL=true
    username: root
    password: 123
  application:
    name: provider   #配置服务名
  cloud:
    zookeeper:
      connect-string: localhost:2181  #注册zookeeper地址

mybatis:
  configuration:
    map-underscore-to-camel-case: true # 配置mybatis字段与实体类属性映射


# 配置打印SQL的日志
logging:
  level:
    com.cloud.demo.microprovider.mapper:  debug

UserInfo实体类

代码语言:javascript
AI代码解释
复制
package com.cloud.demo.microprovider.domain;

import lombok.Getter;
import lombok.Setter;

import java.util.Date;

@Getter    //lombok插件生成get方法
@Setter    //lombok插件生成set方法
public class UserInfo {
    private Integer userId;
    private String userName;
    private int userAge;
    private Date userBirth;
}

service接口

代码语言:javascript
AI代码解释
复制
package com.cloud.demo.microprovider.service;

import com.cloud.demo.microprovider.domain.UserInfo;

public interface UserService {
    UserInfo getUserById(Integer userId);
}

service实现类

代码语言:javascript
AI代码解释
复制
package com.cloud.demo.microprovider.service;

import com.cloud.demo.microprovider.domain.UserInfo;
import com.cloud.demo.microprovider.mapper.UserInfoMapper;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

@Service
public class UserServiceImpl implements UserService {
    @Resource
    private UserInfoMapper userMapper;

    @Override
    public UserInfo getUserById(Integer userId) {
        return userMapper.getUser(userId);
    }
}

Mapper

代码语言:javascript
AI代码解释
复制
package com.cloud.demo.microprovider.mapper;

import com.cloud.demo.microprovider.domain.UserInfo;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

public interface UserInfoMapper {

    @Select("SELECT USER_ID, " +
            "USER_NAME, USER_AGE, " +
            "USER_BIRTH FROM T_USER WHERE USER_ID=#{userId}")
    UserInfo getUser(@Param("userId") Integer userId);
}

Controller

代码语言:javascript
AI代码解释
复制
package com.cloud.demo.microprovider.controller;

import com.cloud.demo.microprovider.domain.UserInfo;
import com.cloud.demo.microprovider.service.UserService;
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.RestController;

@RestController
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("user/{id}")
    public UserInfo getUser(@PathVariable("id") Integer userId) {
        return userService.getUserById(userId);
    }
}

服务启动类:

代码语言:javascript
AI代码解释
复制
package com.cloud.demo.microprovider;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@MapperScan("com.cloud.demo.microprovider.mapper")//扫描Mapper到Spring容器中
@EnableDiscoveryClient //将服务注册到Zookeeper中管理
public class MicroProviderApplication {

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

消费端工程:

pom.xml

代码语言:javascript
AI代码解释
复制
<?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>

    <groupId>com.gerry.cloud.demo</groupId>
    <artifactId>micro-consumer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>micro-consumer</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </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>

    <!--spring cloud依赖管理-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.SR2</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

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

        <!--引入zookeeper 测试时使用,只能连接本地zookeeper-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zookeeper-all</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.zookeeper</groupId>
                    <artifactId>zookeeper</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.12</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>

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


</project>

application.yml配置

代码语言:javascript
AI代码解释
复制
server:
  port: 8888  #为了与生成端端口不同,设置端口号

spring:
  cloud:
    zookeeper:
      connect-string: localhost:2181  #注册zookeeper地址
      discovery:
        register: false  #设置为false代表不会注册进zookeeper

实体类

代码语言:javascript
AI代码解释
复制
package com.gerry.cloud.demo.microconsumer.vo;

import com.fasterxml.jackson.annotation.JsonAlias;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Getter;
import lombok.Setter;

import java.util.Date;

@Getter
@Setter
public class UserVo {
    private Integer userId;
    @JsonAlias("userName") // 配置json字段映射
    private String personName;
    private int userAge;
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date userBirth;
}
代码语言:javascript
AI代码解释
复制
package com.gerry.cloud.demo.microconsumer.config;

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

/**
 * 把RestTemplate对象装配到spring容器管理
 */
@SpringBootConfiguration
public class RestTemplateConfiguration {
    @Bean
    @LoadBalanced  //负载均衡
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

Controller

代码语言:javascript
AI代码解释
复制
package com.gerry.cloud.demo.microconsumer.controller;

import com.gerry.cloud.demo.microconsumer.vo.UserVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class UserWarpController {

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private LoadBalancerClient loadBalancerClient;

    // 写死访问api方式测试
    /*@GetMapping("warp/user/{version}/{id}")
    public UserVo getUser(@PathVariable("version") double version
            , @PathVariable("id") Integer userId, String name) {
        System.out.println(version);
        System.out.println(name);
        // url必须是rest风格路径
        return restTemplate.getForObject("http://localhost:8080//user/"+userId, UserVo.class);
    }*/

    /*@GetMapping("warp/user/{id}") 
    public UserVo getUser(@PathVariable("id") Integer userId) {  //可以实现负载均衡
        ServiceInstance serviceInstance = loadBalancerClient.choose("provider");
        String host = serviceInstance.getHost(); // 主机名
        int port = serviceInstance.getPort(); // 端口号
        String url = String.format("http://%s:%s/%s/%d",host, port, "user", userId);
        System.out.println(url);
        // url必须是rest风格路径
        return restTemplate.getForObject(url, UserVo.class);
    }*/

    @GetMapping("warp/user/{id}") //可以实现负载均衡
    public UserVo getUser(@PathVariable("id") Integer userId) {
        // url必须是rest风格路径
        return restTemplate.getForObject("http://provider/user/"+userId, UserVo.class);
    }
}

服务启动类

代码语言:javascript
AI代码解释
复制
package com.gerry.cloud.demo.microconsumer;

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

@SpringBootApplication
@EnableDiscoveryClient
public class MicroConsumerApplication {

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

注意:此篇文章只是测试时使用,只能连接本地zookeeper,不能连接远程zookeeper,原因是zookeeper依赖不对,应改为:

代码语言:javascript
AI代码解释
复制
        <!--Service Discovery with Zookeeper-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
        </dependency>
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-10-27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SpingCloud之feign框架调用
总结起来,feign框架可以理解成路由,对url进行再次包装后供给客户端调用,可以在这个路由上进行一系列限制操作,增强安全性。
HUC思梦
2020/09/03
5890
SpingCloud之feign框架调用
SpringCloud 服务注册与发现之Zookeeper
cheese
2023/10/25
3500
SpringCloud 服务注册与发现之Zookeeper
Docker 部署 SpringCloud 微服务的服务提供者和消费者(初级版)
Spring Cloud 微服务和 Docker 容器化技术,随便拿出来一个,都够你玩半天喝二两的。那么当它俩交叉在一起时,确实让新手烧脑。
子乾建建-Jeff
2020/06/29
1.6K0
Docker 部署 SpringCloud 微服务的服务提供者和消费者(初级版)
SpringCloud 服务注册与发现
​ SpringCloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务治理。 在传统的 RPC 远程调用框架中, 管理每个服务与服务之间依赖关系比较复杂, 所以需要使用服务治理管理服务与服务之间依赖关系, 了以实现服务调用、 负载均衡、容错等, 实现服务发现与注册 。
OY
2022/03/17
9220
SpringCloud 服务注册与发现
Docker 部署 SpringCloud 微服务(docker-compose 编排微服务高可用案例)
前面的一篇文章,通过对每个项目建立单独的 Dockerfile,可以实现对单个项目生成 Docker 镜像,然后单独启动容器,可以实现简单连接,达到部署的目的。
子乾建建-Jeff
2020/06/29
9.8K2
Docker 部署 SpringCloud 微服务(docker-compose 编排微服务高可用案例)
03Zookeeper服务注册与发现
wget https://mirrors.estointernet.in/apache/zookeeper/zookeeper-3.6.2/apache-zookeeper-3.6.2-bin.tar.gz ​```
Remember_Ray
2020/10/29
4290
03Zookeeper服务注册与发现
SpringCloud之zookeeper
​ ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
shaoshaossm
2022/12/27
2890
SpringCloud之zookeeper
springcloud整合Zookeeper
注册中心Zookeeper zookeeper是一个分布式协调工具,可以实现注册中心功能  关闭Linux服务器防火墙后启动zookeeper服务器  zookeeper服务器取代Eureka服务器,zk作为服务注册中心  服务提供者  新建cloud-provider-payment8004 version已经交给父工程管理  <!-- 统一管理jar包版本 --> <!-- 统一管理jar包版本 --> <properties> <project.build.sour
一个风轻云淡
2022/11/13
3050
springcloud整合Zookeeper
如何使用Java Spring Boot 创建一个微服务项目 二?
上一篇我们已经链接了 如何使用Java Spring Boot 创建一个微服务项目 一?这一篇我们接着实现第二部分
用户1418987
2023/10/26
3010
如何使用Java Spring Boot 创建一个微服务项目 二?
07-SpringCloud Zookeeper
使用Zookeeper代替Eureka,为啥要代替,emm,应该关注这一块的都知道【作死的边缘疯狂试探】
彼岸舞
2021/08/24
5430
SpringCloud技术指南系列(七)服务注册发现之Zookeeper服务调用
目前服务发现的解决方案有Eureka,Consul,Zookeeper等,这三个是SpringCloud官方支持的。
品茗IT
2019/09/12
9660
SpringCloud入门系列之微服务之间的通信
Ribbon作为消费者微服务一端,也会向注册中心进行注册,注册中心Eureka service会向消费者Ribbon提供当前注册的所有节点数据(url、端口)信息。然后根据轮循(默认)策略请求服务提供者。
AI码真香
2022/09/13
9840
Spring Cloud Alibaba微服务项目中Redis实现分布式事务锁实践
我们知道同一个进程里面为了解决资源共享而不出现高并发的问题可以通过高并发编程解决,通过给变量添加volatile关键字实现线程间变量可见;通过synchronized关键字修饰代码块、对象或者方法以及通过调用java.util.current包下的API显式地加锁和释放锁操作都实现多线程场景下的同步处理。
用户3587585
2022/01/06
1.4K0
Spring Cloud Alibaba微服务项目中Redis实现分布式事务锁实践
SpringCloud服务发现Eureka的使用教程
PS:eureka在springcloud中充当服务注册功能,相当于dubbo+zk里面得zk,但是比zk要简单得多,zk可以做得东西太多了,包括分布式锁,分布式队列都是基于zk里面得四种节点加watch机制通过长连接来实现得,但是eureka不一样,eureka是基于HTTPrest来实现的,就是把服务的信息放到一个ConcurrentHashMap中,然后服务启动的时候去读取这个map,来把所有服务关联起来,然后服务器之间调用的时候通过信息,进行http调用。eureka包括两部分,一部分就是服务提供者(对于eureka来说就是客户端),一部分是服务端,客户端需要每个读取每个服务的信息,然后注册到服务端,很明显了,这个服务端就是接受客户端提供的自身的一些信息。
IT架构圈
2021/10/21
5860
SpringCloud服务发现Eureka的使用教程
SpringCloud 微服务搭建
Maven 中的 dependencyManagement 和 dependencies
OY
2022/03/17
1.1K0
SpringCloud 微服务搭建
Spring-Boot:Spring Cloud构建微服务架构
概述:   从上一篇博客《Spring-boot:5分钟整合Dubbo构建分布式服务》 过度到Spring Cloud,我们将开始学习如何使用Spring Cloud 来搭建微服务。继续采用上一篇博客
九灵
2018/03/09
2.3K0
Spring-Boot:Spring Cloud构建微服务架构
SpringCloud整合zookeeper
1.新建名为cloud-provider-payment8004的Maven工程。
大忽悠爱学习
2021/12/07
3890
SpringCloud整合zookeeper
【云原生】springcloud06——订单服务注册zookeeper
上一讲我们已经讲将支付服务进zookeeper完成,结合下图,可以发现我们还需要将订单服务注册进zookeeper。
半旧518
2022/10/26
6590
【云原生】springcloud06——订单服务注册zookeeper
springboot-springcloud-Eureka服务中心的搭建
首先解释一下集群与分布, 集群:就是把一个业务放到不同的服务器上,集群是一个比较有组织的架构,如果其中一个节点挂掉,其他节点可以顶上来,所以集群服务的健壮性比较好。 分布:简单来说就是,把一个大的业务拆分成多个小业务分别部署在不同的服务器上,如果一个节点挂掉,这个业务就挂了,如果这个业务还会被其他业务调用的话,那么另一个业务也挂了,所以其健壮性不好。
知识浅谈
2020/10/29
1K0
SpringCloud(六)—OpenFeign的执行流程以及配置时需要注意的点
OpenFeign代替之前的RestTemplate代码。也是写在Application Client中。把OpenFeign接口单独放在feign包中,表示服务调用层。当需要调用其他服务时,直接注入OpenFeign接口对象就可以像调用本地方法一样调用远程服务。
全栈程序员站长
2022/06/29
1.1K0
SpringCloud(六)—OpenFeign的执行流程以及配置时需要注意的点
相关推荐
SpingCloud之feign框架调用
更多 >
领券
社区新版编辑器体验调研
诚挚邀请您参与本次调研,分享您的真实使用感受与建议。您的反馈至关重要,感谢您的支持与参与!
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
首页
学习
活动
专区
圈层
工具
MCP广场
首页
学习
活动
专区
圈层
工具
MCP广场