Springboot2.0+SpringCloud的搭建 以及常见问题解决

最近公司的项目有一个是类似于集成功能的一个平台的实现,各个子系统的用户管理都需要在集成的平台上进行操作,因为一些不可抗拒因素,平台对用户管理的操作 是通过ajax发送请求来完成的,这样也出现了一个问题,就是当我一个子系统项目出现了报错500的时候,我本地的数据库仍然修改了用户相关的信息,也就导致了平台数据库的数据和子系统数据库的数据不同步的问题。所以就需要解决分布式事务,所以自己根据慕课网的一些视频资料先来使用Springcloud搭建一个分布式的项目,但是因为大部分的资料都是Springboot1x 所以项目实际的操作过程中还是出现了很多问题 在这里记录一下。

什么是springcloud

springcloud 是很多种组件的整合,基于Sringboot构建的,它的版本号也很有意思 是根据伦敦的地铁站名命名的,而且不同版本的springcloud引用的依赖是不太一样的。在我的这个测试的项目中主要是用到了以下的几个组件

  • Eureka(服务注册中心)
  • Zuul(网关)
  • Hytrix(断路器)
  • Feign(声明式web service客户端)

实例

项目的思路也比较明确

  • 一个注册中心registry
  • 网关gloxy
  • 两个服务 User 和 Order 然后通过feign 使用User来调用Order服务
  • Hytrix可以单独部署的 我是和注册中心放到了一起
    项目结构如图;


    项目结构

    可以看到还有一个service 这个包之后用到的时候会再说,

注册中心的创建

首先创建registry pom文件引入依赖

  <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>com.emp.test</groupId>
            <artifactId>service</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.emp.test</groupId>
            <artifactId>transcation</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
 <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>
        </dependencies>
    </dependencyManagement>

server的配置也是比较简单的 在yml文件中修改一下端口号 使用security来配置一下用户名和密码就可以,详细的配置文件如下

server:
  port: 8761

spring:
  application:
    name: registry
  security:
    user:
      name: zhou
      password: 12345678
  freemarker:
    prefer-file-system-access: false


eureka:
  client:
    register-with-eureka: false
    fetch-registry: false
    serviceUrl:
      defaultZone: http://zhou:12345678@localhost:${server.port}/eureka/

2.0的security配置也和之前不太一样了 register-with-eureka: false fetch-registry: false这两个配置 是为了防止server自己注册自己,禁止以下就好了 prefer-file-system-access是因为有些情况写会因为freemarker的原因 无法显示eureka的首页,当然不显示首页的原因 还可能是因为springcloud启动设置的问题 这个在后边会单独解决一下。

yml文件配置好之后 再在启动项中 添加

@SpringBootApplication
@EnableEurekaServer
@EnableHystrixDashboard
public class RegistryApplication {

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

    @Bean
    public ServletRegistrationBean getServlet() {
        HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
        ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
        registrationBean.setLoadOnStartup(1);
        registrationBean.addUrlMappings("/actuator/hystrix.stream");
        registrationBean.setName("HystrixMetricsStreamServlet");
        return registrationBean;
    }
}

getServlet这个方法是因为在2.0在使用的时候 直接启动访问hystrix 会显示一个no connct的报错,具体的我忘记截图了 项目不会报错 页面上不会显示监控的效果 加上这个方法之后就ok了。
在2.0中因为security默认启用了csrf检验,要在eurekaServer端配置security的csrf检验为false。
所以在repostory中新建一个config文件

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable();
        super.configure(http);
    }
}

不然会报错

ERROR 11612 --- [tbeatExecutor-0] com.netflix.discovery.DiscoveryClient    : *****:***** - was unable to send heartbeat!

这样注册中心就完成了 接下来 完成网关的创建

zuul网关的创建

同样 先引入pom文件

 <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
        </dependency>
  <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <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>
        </dependencies>
    </dependencyManagement>

然后再配置文件中进行配置

server:
  port: 8888

spring:
  application:
    name: proxy
eureka:
  client:
    serviceUrl:
      defaultZone:  http://zhou:12345678@localhost:8761/eureka

zuul:
  routes:
    userApi:
      path: /test/**
      stripPrefix: false
      serviceId: user

management:
  endpoints:
    web:
      exposure:
        include: ["health","info","hystrix.stream"]

配置端口号 application name 和注册中心的路径
zuul的那个配置是指我/test/**的所有连接 都会被当做是application name为user的服务下的链接地址,management的配置呢是用于hytrix的也是用来解决显示没有链接的问题的
然后在启动类中

@SpringBootApplication
@EnableZuulProxy
@EnableEurekaClient
public class ProxyApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProxyApplication.class, args);
    }
}
服务的创建

我创建了两个服务 一个是User 一个是Order 需要User可以调用Order的服务,用的jpa和h2的内置数据库 没什么可记录的 也可以用jdbc和别的数据库来写自己的服务 主要是在User的服务中心 使用feign,引入依赖

   <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-hystrix</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-feign</artifactId>
            <version>1.4.6.RELEASE</version>
        </dependency>

配置文件

server:
  port: 8001

spring:
  application:
    name: user

eureka:
  client:
    serviceUrl:
      defaultZone: http://zhou:12345678@localhost:8761/eureka/

然后新建一个feignClient的接口 用来调用Order的方法

@FeignClient(value = "order",path = "/order/test")
public interface OrderClient extends OrderService {
    @GetMapping("/{id}")
    OrderDto getMyOrder(@PathVariable(name = "id")Long id);
}

然后再order的服务中 有一个对应的order/test/{id}Requestmapping就可以了 我写的方法如下

  @RequestMapping("/{id}")
    public OrderDto getMyOrder(@PathVariable(name = "id")Long id){
        Order order = orderService.getOrderById(id);
        OrderDto orderDto = new OrderDto();
        orderDto.setDetail(order.getDetail());
        orderDto.setTitle(order.getTitle());
        orderDto.setOrder_id(order.getOrder_id());
        return orderDto;
    }

可以看到这两个方法中 我都用到了一个OrderDto的类,
这个类就是我放在service中的类
就是把两个服务中 都会用到的实体类 给提取出来 然后在pom文件中引入包就可以了。
当然想法是比较好的 结果实际启动项目的时候就发生了报错 因为在不使用DTO的时候 项目已经顺利跑起来了 那么就是我DTO的引入问题,后来经过一系列的修改和测试 最后在修改了Registry的启动后好用了,我是把最外的项目transcation作为serverparent项目。

   <groupId>com.emp.test</groupId>
    <artifactId>transcation</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>service</module>
    </modules>

然后加上了

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.5.RELEASE</version>
    </parent>

然后将registry中的内容修改为

   <parent>
        <groupId>com.emp.test</groupId>
        <artifactId>transcation</artifactId>
        <version>1.0-SNAPSHOT</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

然后启动四个项目


登录界面

首页

Hystrix

一个简单的Sprinboot+Springcloud的项目就搭建完成了

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,064评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,606评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,011评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,550评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,465评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,919评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,428评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,075评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,208评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,185评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,191评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,914评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,482评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,585评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,825评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,194评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,703评论 2 339

推荐阅读更多精彩内容