项目实战01_初始化项目

追求适度,才能走向成功;人在顶峰,迈步就是下坡;身在低谷,抬足既是登高;弦,绷得太紧会断;人,思虑过度会疯;水至清无鱼,人至真无友,山至高无树;适度,不是中庸,而是一种明智的生活态度。

导读:本篇文章讲解 项目实战01_初始化项目,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

在这里插入图片描述

一、nacos安装:

1.解压nacos-server-2.0.3
2.D:\JavaSoft\cluster\nacos\bin 双击startup.cmd即可
在这里插入图片描述

3.Nacos端口为8848
http://192.168.66.1:8848/nacos/index.html
4.账号密码nacos naocs

二、Maven依赖

   <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.11.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <boot-version>2.1.11.RELEASE</boot-version>
        <mybatis.starter.version>2.0.0</mybatis.starter.version>
        <mapper.starter.version>2.1.5</mapper.starter.version>
    </properties>
    <dependencies>
        <!--自动get\set-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!-- springboot openfeign rpc远程调用 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <!--  springboot 整合web组件-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--  springboot nacos-discovery-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
            <version>2.1.1.RELEASE</version>
        </dependency>

    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${boot-version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.1.1.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

        </dependencies>
    </dependencyManagement>

三、构建微信微服务

1. jc-sp-service-api-weixin–接口层

package com.demo.api.weixin;

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

/**
 * @Author: JYC
 * @Title: WeChatService
 * @Description: TODO
 * @Date: 2022/4/24 10:21
 */
public interface WeChatService {

    @GetMapping("/getWeChat")
    String getWeChat(@RequestParam("a") Integer a);
}

2. jc-sp-service-weixin—实现层

package com.demo.api.impl.weixin;

import com.demo.api.weixin.WeChatService;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Author: JYC
 * @Title: WeChatServiceImpl
 * @Description: TODO
 * @Date: 2022/4/24 11:21
 */
@RestController
public class WeChatServiceImpl implements WeChatService {
    @Override
    public String getWeChat(Integer a) {
        return "getWeChat:a:" + a;
    }
}

3. application.yml

spring:
  application:
    ###服务的名称
    name: demo-weixin
  cloud:
    nacos:
      discovery:
        ###nacos注册地址
        server-addr: 127.0.0.1:8848
server:
  port: 9000

4. 接口访问

http://127.0.0.1:9000/getWeChat?a=1

四、构建会员微服务

1. jc-sp-service-api-member 接口层

package com.demo.api.member;

import com.demo.api.base.BaseResponse;
import org.springframework.web.bind.annotation.GetMapping;

public interface MemberService {
    @GetMapping("memberToWeiXin")
    String memberToWeiXin(Integer a);

    /**
     * 不符合规范
     * @return
     */
    @GetMapping("addMember")
    BaseResponse<String> addMember(String userName, String pwd, Integer age);
}

2. jc-sp-service-member 实现层

package com.demo.api.impl.member;

import com.demo.api.base.BaseApiService;
import com.demo.api.base.BaseResponse;
import com.demo.api.impl.feign.WeChatServiceFeign;
import com.demo.api.member.MemberService;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Author: JYC
 * @Title: MemberServiceImpl
 * @Description: TODO
 * @Date: 2022/4/24 14:37
 */
@RestController
public class MemberServiceImpl extends BaseApiService<String> implements MemberService {
    @Autowired
    private WeChatServiceFeign weChatServiceFeign;

    @Override
    public String memberToWeiXin(Integer a) {
        // Feign调用微信服务接口
        return weChatServiceFeign.getWeChat(a);
    }

    @Override
    public BaseResponse<String> addMember(String userName, String pwd, Integer age) {
        if (StringUtils.isEmpty(userName)) {
            return setResultError("userName is null");
        }
        int j = 1 / age;
        return setResultSuccess();
    }
}

3. feign客户端接口

package com.demo.api.impl.feign;

import com.demo.api.weixin.WeChatService;
import org.springframework.cloud.openfeign.FeignClient;

/**
 * @Author: JYC
 * @Title: WeChatService
 * @Description: TODO
 * @Date: 2022/4/24 10:21
 */
@FeignClient("demo-weixin")
public interface WeChatServiceFeign extends WeChatService {
    /**
     * feign rpc 远程调用 405
     * @param a
     * @return
     */
//    @GetMapping("/getWeChat")
//    String getWeChat(@RequestParam("a") Integer a);
}

4. application.yml

spring:
  application:
    ###服务的名称
    name: demo-member
  cloud:
    nacos:
      discovery:
        ###nacos注册地址
        server-addr: 127.0.0.1:8848
server:
  port: 7000

5. AppMember启动类

package com.demo.api;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;

/**
 * @Author: JYC
 * @Title: AppMember
 * @Description: TODO
 * @Date: 2022/4/24 14:43
 */
@EnableFeignClients
@SpringBootApplication
public class AppMember {
    public static void main(String[] args) {
        SpringApplication.run(AppMember.class);
    }
}

注意:启动类上加上@EnableFeignClients,否则会报如下错误:
Field weChatServiceFeign in com.demo.api.impl.member.MemberServiceImpl required a bean of type 'com.demo.api.impl.feign.WeChatServiceFeign' that could not be found.

接口访问:http://127.0.0.1:7000/memberToWeiXin?a=1

五、接口的定义规范

1.作为接口路径,为了方便清晰的区分来自不同的系统,可以采用不同系统/模块名作为接口路径前缀。
格式规范如下:
支付模块 /pay/xx
订单模块 /order/xx
2.如:接口路径中添加类似”v1″、”v2″等版本号。
格式规范如下:
/xx/v1/xx
更新版本后可以使用v2、v3等、依次递加。
3.可结合【接口路径规范】、【版本控制规范】,外加具体接口命名(路径中可包含请求数据,如:id等),建议具体接口命名也要规范些,可使用”驼峰命名法”按照实现接口的业务类型、业务场景等命名,有必要时可采取多级目录命名,但目录不宜过长,两级目录较为适宜。
格式规范如下:
/user/v1/login 用户服务/模块的系统登录接口
/order/v1/getOrder/{ID} 根据orderId获取订单信息
GET:从服务器取出资源(一项或多项)
POST:在服务器新建一个资源。
PUT:在服务器更新资源(客户端提供改变后的完整资源)
PATCH:在服务器更新资源(客户端提供改变的属性)
DELETE:从服务器删除资源
4.请求规范
请求头:
请求头根据项目需求添加配置参数。如:请求数据格式,accept=‘application/json’等。如有需要,请求头可根据项目需求要求传入用户token、唯一验签码等加密数据。
请求参数/请求体:
请求参数字段,尽可能与数据库表字段、对象属性名等保持一致,因为保持一致最省事,最舒服的一件事。
5.返回数据规范
统一规范返回数据的格式,对己对彼都有好处,此处以json格式为例。返回数据应包含:返回状态码、返回状态信息、具体数据。
格式规范如下:

{
    "code":"000000",
    "msg":"success",
    "data": {
        //json格式的具体数据
    }
}

6.Api Code状态码

1** 服务器收到请求,需要请求者继续执行操作
2** 操作被成功接收并处理
3** 重定向,需要进一步的操作以完成请求
4** 客户端错误,请求包含语法错误或无法完成请求
5** 服务器错误,服务器在处理请求的过程中发生了错误

1xx
临时响应,表示临时响应并需要请求者继续执行操作的状态代码。

代码 说明 解释
100 继续 请求者应当继续提出请求。服务器返回此代码表示已收到请求的第一部分,正在等待其余部分
101 切换协议 请求者已要求服务器切换协议,服务器已确认并准备切换
2xx
成功,表示成功处理了请求的状态代码

代码 说明 解释
200 成功 服务器已成功处理了请求。通常,这表示服务器提供了请求的网页
201 已创建 请求成功并且服务器创建了新的资源
202 已接受 服务器已接受请求,但尚未处理
203 非授权信息 服务器已成功处理了请求,但返回的信息可能来自另一来源
204 无内容 服务器成功处理了请求,但没有返回任何内容
205 重置内容 服务器成功处理了请求,但没有返回任何内容
206 部分内容 服务器成功处理了部分 GET 请求

3xx
重定向,表示要完成请求,需要进一步操作。 通常,这些状态代码用来重定向

代码 说明 解释
300 多种选择 针对请求,服务器可执行多种操作。服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择。
301 永久移动 请求的网页已永久移动到新位置。服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。
302 临时移动 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
303 查看其他位置 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。
304 未修改 自从上次请求后,请求的网页未修改过。服务器返回此响应时,不会返回网页内容。
305 使用代理 请求者只能使用代理访问请求的网页。如果服务器返回此响应,还表示请求者应使用代理。
307 临时重定向 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求
4xx
请求错误,这些状态代码表示请求可能出错,妨碍了服务器的处理

代码 说明 解释
400 错误请求 服务器不理解请求的语法。
401 未授权 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。
403 禁止 服务器拒绝请求。
404 未找到 服务器找不到请求的网页。
405 方法禁用 禁用请求中指定的方法。
406 不接受 无法使用请求的内容特性响应请求的网页。
407 需要代理授权 此状态代码与 401(未授权)类似,但指定请求者应当授权使用代理。
408 请求超时 服务器等候请求时发生超时。
409 冲突 服务器在完成请求时发生冲突。服务器必须在响应中包含有关冲突的信息。
410 已删除 如果请求的资源已永久删除,服务器就会返回此响应。
411 需要有效长度 服务器不接受不含有效内容长度标头字段的请求。
412 未满足前提条件 服务器未满足请求者在请求中设置的其中一个前提条件。
413 请求实体过大 服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。
414 请求的 URI 过长 请求的 URI(通常为网址)过长,服务器无法处理。
415 不支持的媒体类型 请求的格式不受请求页面的支持。
416 请求范围不符合要求 如果页面无法提供请求的范围,则服务器会返回此状态代码。
417 未满足期望值 服务器未满足”期望”请求标头字段的要求
5xx
服务器错误,这些状态代码表示服务器在尝试处理请求时发生内部错误。 这些错误可能是服务器本身的错误,而不是请求出错

代码 说明 解释
500 服务器内部错误 服务器遇到错误,无法完成请求。
501 尚未实施 服务器不具备完成请求的功能。例如,服务器无法识别请求方法时可能会返回此代码。
502 错误网关 服务器作为网关或代理,从上游服务器收到无效响应。
503 服务不可用 服务器目前无法使用(由于超载或停机维护)。通常,这只是暂时状态。
504 网关超时 服务器作为网关或代理,但是没有及时从上游服务器收到请求。
505 HTTP 版本不受支持 服务器不支持请求中所用的 HTTP 协议版本。

1. jc-sp-service-base

package com.demo.api.base;

import com.demo.api.constants.Constants;

/**
 * @Author: JYC
 * @Title: BaseApiService
 * @Description: 微服务接口实现该接口可以使用传递参数可以直接封装统一返回结果集
 * @Date: 2022/4/24 15:34
 */
public class BaseApiService<T> {
    public BaseResponse<T> setResultError(Integer code, String msg) {
        return setResult(code, msg, null);
    }

    /**
     * 返回错误,可以传msg
     *
     * @param msg
     * @return
     */
    public BaseResponse<T> setResultError(String msg) {
        return setResult(Constants.HTTP_RES_CODE_500, msg, null);
    }

    /***
     * 返回成功,可以传data值
     * @param data
     * @return
     */
    public BaseResponse<T> setResultSuccess(T data) {
        return setResult(Constants.HTTP_RES_CODE_200, Constants.HTTP_RES_CODE_200_VALUE, data);
    }

    /**
     * 返回成功,沒有data值
     *
     * @return
     */
    public BaseResponse<T> setResultSuccess() {
        return setResult(Constants.HTTP_RES_CODE_200, Constants.HTTP_RES_CODE_200_VALUE, null);
    }


    /**
     * 通用封装 通用封装
     *
     * @param code
     * @param msg
     * @param data
     * @return
     */

    public BaseResponse<T> setResult(Integer code, String msg, T data) {
        return new BaseResponse<T>(code, msg, data);
    }
}

package com.demo.api.base;

import lombok.Data;

/**
 * @Author: JYC
 * @Title: BaseResponse
 * @Description: 微服务接口统一返回码
 * @Date: 2022/4/24 15:03
 */
@Data
public class BaseResponse<T> {

    /**
     * 返回码
     */
    private Integer code;
    /**
     * 消息
     */
    private String msg;
    /**
     * 返回
     */
    private T data;
    // 分页

    public BaseResponse() {

    }

    public BaseResponse(Integer code, String msg, T data) {
        super();
        this.code = code;
        this.msg = msg;
        this.data = data;
    }
}

package com.demo.api.constants;

/**
 * @Author: JYC
 * @Title: Constants
 * @Description: TODO
 * @Date: 2022/4/24 15:34
 */
public interface Constants {
    // 响应请求成功
    String HTTP_RES_CODE_200_VALUE = "success";
    // 系统错误
    String HTTP_RES_CODE_500_VALUE = "fail";
    // 响应请求成功code
    Integer HTTP_RES_CODE_200 = 200;
    // 系统错误
    Integer HTTP_RES_CODE_500 = 500;
}

六、整合全局捕获异常

package com.demo.api.base;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.HashMap;
import java.util.Map;

/**
 * @Author: JYC
 * @Title: GlobalExceptionHandler
 * @Description: TODO
 * @Date: 2022/4/24 15:44
 */
@ControllerAdvice(basePackages = "com.demo.api.impl")
public class GlobalExceptionHandler {

    @ExceptionHandler(RuntimeException.class)
    @ResponseBody
    public Map<String, Object> errorResult() {
        Map<String, Object> errorResultMap = new HashMap<String, Object>();
        errorResultMap.put("code", "500");
        errorResultMap.put("msg", "系统出现错误!");
        return errorResultMap;
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/131261.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!