初识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

 

上一篇:SpingCloud之feign框架调用
下一篇:SpringBoot整合Redis-RedisTemplate

发表评论

最新留言

很好
[***.229.124.182]2025年04月12日 10时49分04秒