
初识SpringCloud微服务
发布日期:2021-05-09 04:58:03
浏览次数:13
分类:博客文章
本文共 11692 字,大约阅读时间需要 38 分钟。
本文使用生产端与消费端两个工程来展示微服务之间的调用方式
具体内容详见代码注释
生产端工程:
pom.xml
4.0.0 com.cloud.demo micro-provider 0.0.1-SNAPSHOT jar micro-provider Demo project for Spring Boot org.springframework.boot spring-boot-starter-parent 2.0.6.RELEASE UTF-8 UTF-8 1.8 org.springframework.cloud spring-cloud-dependencies Finchley.SR2 pom import org.springframework.boot spring-boot-starter-web org.mybatis.spring.boot mybatis-spring-boot-starter 1.3.2 org.springframework.cloud spring-cloud-starter-zookeeper-all org.apache.zookeeper zookeeper org.apache.zookeeper zookeeper 3.4.12 org.slf4j slf4j-log4j12 org.springframework.boot spring-boot-devtools mysql mysql-connector-java org.projectlombok lombok true org.springframework.boot spring-boot-maven-plugin true
application.yml配置
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实体类
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接口
package com.cloud.demo.microprovider.service;import com.cloud.demo.microprovider.domain.UserInfo;public interface UserService { UserInfo getUserById(Integer userId);}
service实现类
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;@Servicepublic class UserServiceImpl implements UserService { @Resource private UserInfoMapper userMapper; @Override public UserInfo getUserById(Integer userId) { return userMapper.getUser(userId); }}
Mapper
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
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;@RestControllerpublic class UserController { @Autowired private UserService userService; @GetMapping("user/{id}") public UserInfo getUser(@PathVariable("id") Integer userId) { return userService.getUserById(userId); }}
服务启动类:
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
4.0.0 com.gerry.cloud.demo micro-consumer 0.0.1-SNAPSHOT jar micro-consumer Demo project for Spring Boot org.springframework.boot spring-boot-starter-parent 2.0.6.RELEASE UTF-8 UTF-8 1.8 org.springframework.cloud spring-cloud-dependencies Finchley.SR2 pom import org.springframework.boot spring-boot-starter-web org.springframework.cloud spring-cloud-starter-zookeeper-all org.apache.zookeeper zookeeper org.apache.zookeeper zookeeper 3.4.12 org.slf4j slf4j-log4j12 org.springframework.boot spring-boot-devtools org.projectlombok lombok true org.springframework.boot spring-boot-maven-plugin true
application.yml配置
server: port: 8888 #为了与生成端端口不同,设置端口号spring: cloud: zookeeper: connect-string: localhost:2181 #注册zookeeper地址 discovery: register: false #设置为false代表不会注册进zookeeper
实体类
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@Setterpublic class UserVo { private Integer userId; @JsonAlias("userName") // 配置json字段映射 private String personName; private int userAge; @JsonFormat(pattern = "yyyy-MM-dd") private Date userBirth;}
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容器管理 */@SpringBootConfigurationpublic class RestTemplateConfiguration { @Bean @LoadBalanced //负载均衡 public RestTemplate restTemplate() { return new RestTemplate(); }}
Controller
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;@RestControllerpublic 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); }}
服务启动类
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@EnableDiscoveryClientpublic class MicroConsumerApplication { public static void main(String[] args) { SpringApplication.run(MicroConsumerApplication.class, args); }}
注意:此篇文章只是测试时使用,只能连接本地zookeeper,不能连接远程zookeeper,原因是zookeeper依赖不对,应改为:
org.springframework.cloud spring-cloud-starter-zookeeper-discovery
发表评论
最新留言
很好
[***.229.124.182]2025年04月12日 10时49分04秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
100天搞定机器学习|day37 无公式理解反向传播算法之精髓
2021-05-09
数据工程师必备的8项技能,不要只知道Python!
2021-05-09
R in action读书笔记(3)-第六章:基本图形
2021-05-09
R in action读书笔记(19)第十四章 主成分和因子分析
2021-05-09
iOS UIAlertController
2021-05-09
iOS UISlider的使用
2021-05-09
iOS Xcode 打包之后,不能输出日志
2021-05-09
UIPickerView的使用(二)
2021-05-09
iOS 多线程GCD简介
2021-05-09
实现延迟消息队列
2021-05-09
写了一下 micropython 的文件系统单元测试
2021-05-09
说说字库和字模的故事,然后在 MaixPy 里实现打印中文字体(任意字体)吧!
2021-05-09
线性代数应该这样学9:上三角矩阵、对角矩阵
2021-05-09
【科学计算】插值理论
2021-05-09
centos7一步一步搭建docker jenkins 及自定义访问路径重点讲解
2021-05-09
在wxPython使ListCtrl占据整个窗口
2021-05-09
微软面试题
2021-05-09
Google新玩法(转载)
2021-05-09
C#中Dispose和Close的区别!
2021-05-09